Javascript 基于键值从underline.js中的对象数组中删除特定重复项

Javascript 基于键值从underline.js中的对象数组中删除特定重复项,javascript,jquery,arrays,underscore.js,Javascript,Jquery,Arrays,Underscore.js,我有这样一个数组: var array = [ {"id":"A","type":"blue","rng":"50"}, {"id":"A","type":"blue","rng":"75"}, {"id":"A","type":"grey","rng":"76"}, {"id":"B","type":"blue","rng":"50"}, {"id":"B","type":"grey","rng":"85"}, {"id

我有这样一个数组:

var array = [
      {"id":"A","type":"blue","rng":"50"},
      {"id":"A","type":"blue","rng":"75"},
      {"id":"A","type":"grey","rng":"76"},

      {"id":"B","type":"blue","rng":"50"},
      {"id":"B","type":"grey","rng":"85"},
      {"id":"B","type":"grey","rng":"86"},

      {"id":"C","type":"blue","rng":"50"},
      {"id":"C","type":"grey","rng":"65"}
    ]
注:对象按随机顺序排列

我需要过滤掉重复的
“id”:“*”,“type”:“blue”
“id”:“*”,“type”:“grey”
“rng”

因此,最终结果是:

var result = [
      {"id":"A","type":"blue","rng":"50"},
      {"id":"A","type":"grey","rng":"76"},

      {"id":"B","type":"blue","rng":"50"},
      {"id":"B","type":"grey","rng":"86"},

      {"id":"C","type":"blue","rng":"50"},
      {"id":"C","type":"grey","rng":"65"}
    ]

我喜欢使用下划线,但也欢迎使用任何其他解决方案。

您可以使用哈希表和组合键作为索引的引用

var数据=[{id:“A”,type:“blue”,rng:“50”},{id:“A”,type:“blue”,rng:“75”},{id:“A”,type:“grey”,rng:“76”},{id:“B”,type:“grey”,rng:“85”{id:“B”,type:“grey”,rng:“86”},{id:“C”,type:“blue”,rng:“50”{id:“C”,type:“grey”,rng:“65”},
结果=数据.reduce(函数(散列){
返回函数(r,o){
var key=['id','type'].map(函数(k){returno[k];}).join('|');
如果(!(输入散列)){
hash[key]=r.push(o)-1;
}else if(r[hash[key]].rng

。作为控制台包装{max height:100%!important;top:0;}
您可以使用哈希表和组合键作为索引的引用

var数据=[{id:“A”,type:“blue”,rng:“50”},{id:“A”,type:“blue”,rng:“75”},{id:“A”,type:“grey”,rng:“76”},{id:“B”,type:“grey”,rng:“85”{id:“B”,type:“grey”,rng:“86”},{id:“C”,type:“blue”,rng:“50”{id:“C”,type:“grey”,rng:“65”},
结果=数据.reduce(函数(散列){
返回函数(r,o){
var key=['id','type'].map(函数(k){returno[k];}).join('|');
如果(!(输入散列)){
hash[key]=r.push(o)-1;
}else if(r[hash[key]].rng
作为控制台包装{max height:100%!important;top:0;}
您可以使用
forEach()
循环和一个对象作为
thisArg
参数来检查是否存在具有相同
id |类型的对象

var数组=[{“id”:“A”,“type”:“blue”,“rng”:“50”},{“id”:“A”,“type”:“blue”,“rng”:“75”},{“id”:“A”,“type”:“grey”,“rng”:“76”},{“id”:“B”,“type”:“blue”,“rng”:“50”{“id”:“B”,“type”:“grey”,“rng”:“85”{“id”:“B”,“type”:“grey”,“rng”:“86”{“id”:“C”,“type”:“blue”,“rng”:“50”{“id”,“rng”:“65”}
var结果=[]
array.forEach(函数(e){
//创建具有id和类型的密钥
var key=e.id+'|'+e.type;
//检查该对象中是否存在键,以及该键是否未使用当前值创建属性,并将该值推送到结果数组
如果(!this[key])this[key]=e,则result.push(this[key])
否则{
//否则,检查当前元素的rng是否小于具有相同键的上一个对象的rng,以及是否将其设置为当前对象的rng
如果(e.rng
您可以使用
forEach()
循环和一个对象作为
thisArg
参数来检查是否存在具有相同
id |类型的对象

var数组=[{“id”:“A”,“type”:“blue”,“rng”:“50”},{“id”:“A”,“type”:“blue”,“rng”:“75”},{“id”:“A”,“type”:“grey”,“rng”:“76”},{“id”:“B”,“type”:“blue”,“rng”:“50”{“id”:“B”,“type”:“grey”,“rng”:“85”{“id”:“B”,“type”:“grey”,“rng”:“86”{“id”:“C”,“type”:“blue”,“rng”:“50”{“id”,“rng”:“65”}
var结果=[]
array.forEach(函数(e){
//创建具有id和类型的密钥
var key=e.id+'|'+e.type;
//检查该对象中是否存在键,以及该键是否未使用当前值创建属性,并将该值推送到结果数组
如果(!this[key])this[key]=e,则result.push(this[key])
否则{
//否则,检查当前元素的rng是否小于具有相同键的上一个对象的rng,以及是否将其设置为当前对象的rng
如果(e.rngconsole.log(结果)
谢谢。我不完全理解你的解决方案,但对我来说效果很好。我选择它是因为它在这一点上是最短的,不管效率和优雅。@Radoslav T。不客气,我添加了一些解释,希望能有所帮助。谢谢。我不完全理解你的解决方案,但对我来说效果很好。我选择它是因为它在这一点上是最短的,不管效率和优雅。@Radoslav T。不客气,我添加了一些解释,希望能有所帮助。