我有这个数组:

[{name: 'Brad', age: 30, isOlder: true, youngerBrother: 'Oleg'}, {name: 'Brad', age: 30, isOlder: false, youngerBrother: 'Michael'}]

我想检查列表中的项目是否被特定键重复。

例如-如果名称,年龄在列表上相同,则重复行,而无需注意isOlder或youngerBrother。

我尝试使用lodash _uniq,但是没有排除键/注意特定键的选项

最佳答案

您可以使用.filter().some():

var list = [
  {name: 'Brad', age: 30, isOlder: true, youngerBrother: 'Oleg'},
  {name: 'Brad', age: 30, isOlder: false, youngerBrother: 'Michael'}
];

list = list.filter(function(outer, oPos) {
  return !list.some(function(inner, iPos) {
    return iPos > oPos && inner.name == outer.name && inner.age == outer.age;
  });
});

console.log(list);


但是,直接在oPos + 1处启动内部循环会更有效:

var list = [
  {name: 'Brad', age: 30, isOlder: true, youngerBrother: 'Oleg'},
  {name: 'Brad', age: 30, isOlder: false, youngerBrother: 'Michael'}
];

list = list.filter(function(outer, oPos) {
  for(var iPos = oPos + 1; iPos < list.length; iPos++) {
    if(list[iPos].name == outer.name && list[iPos].age == outer.age) {
      return false;
    }
  }
  return true;
});

console.log(list);


另外,我们可以在.filter()中进行迭代时构建遇到的组合键的列表。大多数浏览器应将if(keyList[key])实现为在哈希表中的查找,因此速度非常快。

var list = [
  {name: 'Brad', age: 30, isOlder: true, youngerBrother: 'Oleg'},
  {name: 'Brad', age: 30, isOlder: false, youngerBrother: 'Michael'}
];

var keyList = {};

list = list.filter(function(obj) {
  var key = obj.name + '|' + obj.age;

  if(keyList[key]) {
    return false;
  }
  keyList[key] = true;
  return true;
});

console.log(list);

关于javascript - 从数组中删除重复的对象,但不包括JavaScript中的特定键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38684528/

10-16 22:00