如何通过选择保留哪个来删除数组中的重复项?

时间:2019-05-24 09:23:01

标签: javascript arrays object duplicates unique

问题

我有一个Javascript数组,该数组可以包含重复的(只有2个),其键color的值相同。

  var array = [
    {
      "id": "1",
      "color": "red",
      "animal": null
    },
    {
      "id": "2",
      "color": "red",
      "animal": "cat"
    },
    {
      "id": "3",
      "color": "green",
      "animal": "dog"
    }
  ];

我想删除键color上的重复项,只保留具有键animal而不是null的唯一对象。

  var uniqueArray = [
    {
      "id": "2",
      "color": "red",
      "animal": "cat"
    },
    {
      "id": "3",
      "color": "green",
      "animal": "dog"
    }
  ];

我尝试过的

  var obj = {};

  for (var i = 0; i < array.length; i++) {
    obj[array[i]['name']] = array[i];
  }

  var uniqueArray = new Array();
  for (var key in obj) {
    uniqueArray.push(obj[key]);
  }

这是结果:

var uniqueArray = [
    {
      "id": "1",
      "color": "red",
      "animal": "null"
    },
    {
      "id": "3",
      "color": "green",
      "animal": "dog"
    }
  ];

我不知道如何选择要保留的对象。

注意:我不能使用ES6

3 个答案:

答案 0 :(得分:2)

我希望动物的价值应为 null 而不是第一个动物的“ nul”。

var array = [
    {
      "id": "1",
      "color": "red",
      "animal": null
    },
    {
      "id": "2",
      "color": "red",
      "animal": "cat"
    },
    {
      "id": "3",
      "color": "green",
      "animal": "dog"
    }
  ];

如果要基于颜色选择唯一值(在这种情况下为对象),最好创建另一个对象并将颜色作为获取唯一值的键。

var obj = {};

array.forEach(a => {
 if(!obj[a.color] && a.animal) {
    obj[a.color] = a;
 }
});

现在对象看起来像下面的

  

Blockquote

现在,您将获得一个包含基于颜色的唯一对象的对象,更重要的是,您的动物属性不为null。 您说您无法想到在这里选择什么。 IMO最好选择具有值而不是空值的值。

注意:上面的代码为您提供了一个对象,但是您可以通过以下操作轻松地将其转换为数组。不能完全确定Object.values是否为es6功能(在文档中找不到任何内容)。

var arr = Object.values(obj);

如果您不喜欢上述解决方案,则可以遍历该对象并将其推入数组。

 var finalArr = [];
 Object.keys(obj).forEach(function(key) {
   finalArr.push(obj[key])
 });

答案 1 :(得分:0)

只需使用简单的null删除所有filter值:

var array = [{"id":"1","color":"red","animal":"cat"},{"id":"2","color":"red","animal":"null"},{"id":"3","color":"green","animal":"dog"},{"animal":"dog"}];
var uniqueArray = array.filter(function(e) {
  return e.animal != "null";
});
console.log(uniqueArray);

答案 2 :(得分:0)

不使用ES6

var array = [{
    "id": "1",
    "color": "red",
    "animal": "cat"
  },
  {
    "id": "2",
    "color": "red",
    "animal": "null"
  },
  {
    "id": "3",
    "color": "green",
    "animal": "dog"
  }
];
var a = [];
var arr = [];
array.forEach(function(e, i) {
  if (a.indexOf(e.color) == -1 && e.animal != "null") {
    a.push(e.color)
    arr.push(e)
  }
})
console.log(arr)