基本上我想知道如何在JavaScript中清理对象数组。
我看过一些示例,根据一个元素的值显示如何执行它,我需要它是通用的。这意味着它不依赖于孩子的名字。
Example of the way i don't want
我需要的是一个可以独立于对象结构工作的函数。
例如,它可以用于:
object = [
{value: 'value', configuration: 'configuration'},
{value: 'value2', configuration: 'configuration2'},
{value: 'value', configuration: 'configuration'},
]
//returning:
object = {
{value: 'value', configuration: 'configuration'},
{value: 'value2', configuration: 'configuration2'}
}
它也适用于:
object = [
{name: 'name', property: 'property'},
{name: 'name2', property: 'property2'},
{name: 'name', property: 'property'},
]
//returning:
object = [
{name: 'name', property: 'property'},
{name: 'name2', property: 'property2'}
]
答案 0 :(得分:1)
如果您愿意使用外部库,我建议使用lodash来检查这两个项目是否重复,并按照这种方式进行过滤:
let object = [
{name: 'name', property: 'property'},
{name: 'name2', property: 'property2'},
{name: 'name', property: 'property'},
]
function removeDuplicates(arr) {
return arr.filter((elem, idx) => {
return !arr.slice(idx + 1).find((other) => _.isEqual(elem, other));
});
}
console.log(removeDuplicates(object));

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>
&#13;
答案 1 :(得分:1)
您可以使用filter和json进行通用检查
var list = [
{value: 'value', configuration: 'configuration'},
{value: 'value2', configuration: 'configuration2'},
{value: 'value', configuration: 'configuration'},
];
//filter element
list = list.filter(function(value, index){
var exists = false;
//verify if exists the same element with other index before
for(var i in list){
//generic verify the json
if(JSON.stringify(list[i]) == JSON.stringify(list[index]) && i < index){ exists = true;
break;
}
}
//if dont exists dont filter
return !exists;
});
console.log(list);
您可以使用自定义比较而不是JSON.stringfy
function isEqual(a, b){
for(var i in a)
if(a[i] != b[i])
return false;
for(var i in b)
if(b[i] != a[i])
return false;
return true;
}
因为JSON.stringfy为
生成不同的字符串{value: 'value', configuration: 'configuration'},
和
{ configuration: 'configuration', value: 'value'},
答案 2 :(得分:1)
使用filter
/ findIndex
技巧对数组进行重复数据删除非常简单,唯一的问题是我们需要使用相等函数来比较元素。对于对象,简单的===
将不起作用。
这是一个使用基本浅等于比较器的简单示例。它只检查两个对象对于相同的键具有相同的值,这将适用于示例中的对象(但它不适用于嵌套对象)。根据您的使用情况而定可能还不够。另一个不错的选择是lodash的_.isEqual
方法,或者比较它们的JSON字符串的函数。 重要的是您定义了一个函数来比较满足您要求的两个对象。
var array1 = [
{value: 'value', configuration: 'configuration'},
{value: 'value2', configuration: 'configuration2'},
{value: 'value', configuration: 'configuration'},
];
var array2 = [
{name: 'name', property: 'property'},
{name: 'name2', property: 'property2'},
{name: 'name', property: 'property'},
];
// You need to define an equality function to use with the deduplicator. Heres a basic one.
function isKVEqual(obj1, obj2) {
// Get the keys of these objects, make sure they have the same number of keys.
const o1keys = Object.keys(obj1);
const o2keys = Object.keys(obj2);
if (o1keys.length !== o2keys.length) return false;
// Check that the value of each key is the same in each object.
for (const key of o1keys) {
if (obj2[key] !== obj1[key]) return false;
}
return true;
}
// Deduplicate:
// Make sure to replace the isKVEqual call with whatever custom comparator you want to use.
const dedupedArray1 = array1.filter((item, index, list) => list.findIndex(x => isKVEqual(x, item)) === index);
const dedupedArray2 = array2.filter((item, index, list) => list.findIndex(x => isKVEqual(x, item)) === index);
console.log(dedupedArray1)
console.log(dedupedArray2)