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

Javascript 过滤对象数组,使其仅具有具有相同特定属性的该对象的最后一次出现,javascript,arrays,filter,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); })

如何过滤对象数组,使其仅具有该对象最后一次出现时的相同属性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);
    })
var arr=[{foo:1,id:1},{foo:1,id:2},{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]);

控制台日志(res)通过
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];
});
只需O(n)个时间,您就可以通过
.rightReduce()
具有同时包含结果和哈希的初始值元组的功能

函数lastWithProp(a,p){
返回a.reduceRight((r,o)=>r[1][p+o[p]]?r:(r[1][p+o[p]]=true,r[0]。推送(o),r),[[],{}])[0];
}
var data=[{foo:1,id:1},{foo:1,id:2},{foo:2,id:3}],
结果=lastWithProp(数据“foo”);

控制台日志(结果)通过
foo
的值创建映射请注意,您正在使用单词map来引用对象。与ES6中的
Map
混淆。@Tushar这是真的,但不确定为什么会混淆。覆盖值是天才!谢谢,我必须用它来理解它。@SuperUberDuper我对我的答案添加了一些解释,也许它会有所帮助。它比@Tomalak的代码快多少?@SuperUberDuper OK@Tomalak的代码实际上以命令式的方式做着同样的事情,而这个代码更具功能性。就性能而言,这可以归结为
.forEach()
.righreduce()
的对比,根据我的经验
。righreduce()
在大多数引擎中速度更快。但是,如果Tomalak的代码被修改为使用
while
循环运行,那么肯定会是赢家。对我来说,
.forEach()
在函数式JS和命令式JS中是一个非常不必要的工具,你永远都不需要它,因为它只是一个拖拽。@SuperUberDuper是的。。命令式范例包括直接访问和更改此处或此处定义的变量的指令,迭代由
for
执行,而
循环。。。这是CS的算盘。在纯函数式语言(如Haskell等)中,甚至没有
for
While
循环。一切都由独立的函数等处理。。。从这一点上看,我猜函数式编程范式就像是CS的演算:
var finalArray = Object.keys( map ).map( function(key){
  return map[key];
});