来自如下数组:
[{'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/