如何从 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');
您的示例不是多维数组。但只是一个规则的对象数组。多维数组类似于 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');
我希望能够在没有任何外部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');
您的示例不是多维数组。但只是一个规则的对象数组。多维数组类似于 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');