你如何过滤一个对象数组,使得该对象的最后一次出现具有相同的foo支柱?即
下式给出:
[
{foo:1,id:1},
{foo:1,id:2},
{foo:2,id:3}
]
我想要回来:
[
{foo:1,id:2},
{foo:2,id:3}
我使用es6所以我可以从这里开始:
this.data.filter((item,index,self)=> {
return self.findIndex(o => o.foo === item.foo);
})
答案 0 :(得分:5)
var index = {};
var data = [{foo:1,id:1},{foo:1,id:2},{foo:2,id:3}];
data.forEach(item => index[item.foo] = item);
index[1];
// {foo:1,id:2}
Object.values(index)
// [{foo:1,id:2},{foo:2,id:3}]
答案 1 :(得分:2)
按foo
的值
var map = {};
var arr = [
{foo:1,id:1},
{foo:1,id:2},
{foo:2,id:3}
];
arr.forEach( function(item){
map[ item.foo ] = item;
});
现在终于得到了地图的价值
var finalArray = Object.keys( map ).map( function(key){
return map[key];
});
答案 2 :(得分:1)
在O(n)时间内你可以通过.rightReduce()
完成这项工作
具有初始值元组的功能,同时保存结果和散列。
function lastWithProp(a,p){
return a.reduceRight((r,o) => r[1][p+o[p]] ? r : (r[1][p+o[p]] = true, r[0].push(o),r), [[],{}])[0];
}
var data = [{foo:1,id:1},{foo:1,id:2},{foo:2,id:3}],
result = lastWithProp(data,"foo");
console.log(result);

.rightReduce()
初始值(回调的r
参数)是一个元组(一个双/三/四组......压缩在一起的不同类型的数据组),如{{1} } 在这种情况下。 [[],{}]
保存结果,因为它通过r[0]
和.rightReduce()
的迭代形成,如果以前从未遇到过,则会保存met对象属性值键字符串的哈希映射。因此,当我们第一次见到r[1]
时,我们会在哈希({foo:1,...}
)中将其标记为r[1]
("foo1" = true
)。所以...
答案 3 :(得分:0)
var arr = [{foo:1, id:1}, {foo:1, id:2}, {foo:2, id:3}, {foo:2, id:4}, {foo:2, id:5}, {foo:3, id:6}],
e = {};
arr.forEach(v => e[v.foo] = v.id);
var res = Object.keys(e).map(v => arr.find(c => c.id == e[v]));
console.log(res);