如何从 javascript 中的对象数组中删除重复的数据值?

How to remove duplicate data values from an array of objects in javascript?

我希望能够在没有任何外部javascript库的情况下使用数组方法或某种其他形式的javascript处理 以遍历多维数组并删除所有重复值。下面是一个例子:

var places = [{
    "category": "other",
    "title": "harry University",
    "value": 4788,
    "id": "1"
  },
  {
    "category": "traveling",
    "title": "tommy University",
    "value": 5460,
    "id": "2"
  },
  {
    "category": "education",
    "title": "jerry University",
    "value": 7853456,
    "id": "3"
  },
  {
    "category": "business",
    "title": "Charlie University",
    "value": 6779589,
    "id": "4"
  },
  {
    "category": "business",
    "title": "NYU",
    "value": 0117824,
    "id": "5"
  }
];

我曾尝试使用 array.filter 删除重复的 category 值,但我采用的方法不起作用。

这是我的代码

places = places.map(JSON.stringify).reverse()
  .filter(function(item, index, places) {
    return places.indexOf(item, index + 1) === -1;
  })
  .reverse().map(JSON.parse)
console.log(places)

以上不起作用,因为它是对整个数组进行操作,所以数据不会改变。

当我使用像 underscore.js 这样的库时,他们有一个有效的方法

let newPlaces = [];
_.each(_.uniq(_.pluck(places, "category")), function(category) {
  newPlaces.push(_.findWhere(places, {
    category: category
  }));
});
console.log(newPlaces);

但我希望能够使用 .filter 或其他一些普通的 javascript 方法。

简单的 for 循环。只需使用数组和字符串过滤器调用 DeDupPlaces

const DeDupPlaces = (arrToBefiltered, filter) => {
  const seen = [];
  const result = [];
  for (let i = 0; i < arrToBefiltered.length; i++) {
    const filterValue = arrToBefiltered[i][filter];

    if(!seen.includes(filterValue)){
        seen.push(filterValue);
        result.push(arrToBefiltered[i]);
    }
  }
  return result;
}
DeDupPlaces(places, 'category');

JS Fiddle with your example

您的示例不是多维数组。但只是一个规则的对象数组。多维数组类似于 let a = [[1],[1]];,它是一个数组数组。无论如何,您是否希望简单地删除类别已经出现一次的所有对象(数组中的项目)。您可以根据需要使用 Vanilla Javascript 过滤方法来执行此操作。您只需使用一个对象来计算该对象之前是否出现过。 这是一个简单的方法

function removeDuplicates(arrToBeFiltered, keyToMatch){
  let dups = {};
  return arrToBeFiltered.filter(function(item){ 
    if(item[keyToMatch] in dups){return false;} 
    else {
        dups[item[keyToMatch]] = true; return true;
    }}); 
}
places = removeDuplicates(places,'category');