过滤对象数组,使该对象的最后一次出现具有相同的特定属性

时间:2017-04-14 10:50:35

标签: javascript arrays filter

你如何过滤一个对象数组,使得该对象的最后一次出现具有相同的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);
    })

4 个答案:

答案 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);