javascript - 根据字段的值获取对象的最后一次出现

标签 javascript node.js json

来自如下数组:

[{'name': 'a', 'val': 1}, {'name': 'b', 'val': 2}, {'name': 'a', 'val' ': 3}]

我想要到达:

[{ name: 'b', val: 2 }, { name: 'a', val: 3 }]

这可以通过以下方式实现:

arrOut = _.uniqBy(arrIn.reverse(), 'name').reverse();

但我正在寻找一种更快/更干净的方法,而不需要将整个数组反转两次。

最佳答案

这里有一个想法:迭代数组两次。第一次统计每个名称出现的次数,第二次过滤掉相应计数不为 1 的元素。

示例:

const arrIn = [{'name': 'a', 'val': 1}, {'name': 'b', 'val': 2}, {'name': 'a', 'val': 3}];

const counter = Object.create(null);
for (const element of arrIn) {
  counter[element.name] = (counter[element.name] || 0) + 1;
}

const arrOut = arrIn.filter(element => counter[element.name]-- === 1);
console.log(arrOut);

另一种方法是以相反的顺序迭代数组,跟踪您看到的名称并对结果调用.reverse:

const arrIn = [{'name': 'a', 'val': 1}, {'name': 'b', 'val': 2}, {'name': 'a', 'val': 3}];
const arrOut = [];

const seen = new Set();
for (let i = arrIn.length; i--;) {
  if (!seen.has(arrIn[i].name)) {
    arrOut.push(arrIn[i]);
    seen.add(arrIn[i].name);
  }
}

console.log(arrOut.reverse());

关于javascript - 根据字段的值获取对象的最后一次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55819778/

相关文章:

java - 使用 Gson 将 JSON 转换为带有对象的 HashMap

javascript - 如何使用 `italic` 字体样式测量文本宽度?

javascript - Kendo Scheduler 不会获取数据源

css - node.js - 当参数 express.js 太长时无法加载 css

javascript - 尽管尽可能地捕获拒绝,但仍收到 UnhandledPromiseRejectionWarning

javascript - 在 Express 中使用聊天 irc 机器人发送后无法设置 header

javascript - $ 未定义 Rails 5.1.4,在随机刷新时定义

javascript - angular-highcharts 和 highcharts-angular 有什么区别?

ios - APN BadDeviceToken iff 运行开发版本

java - 在 Google App Engine 上返回空列表在开发服务器上和部署时的行为有所不同