我在服务器端JS中有如下对象数组:
[
{
"Company": "IBM"
},
{
"Person": "ACORD LOMA"
},
{
"Company": "IBM"
},
{
"Company": "MSFT"
},
{
"Place": "New York"
}
]
我需要遍历这个结构,检测任何重复项,然后在每个值旁边找到重复计数。
这两个值必须匹配才能符合重复条件,例如“公司”:“IBM”不匹配“公司”:“MSFT”。
如果需要,我可以选择更改对象的入站数组。我希望输出成为一个对象,但我真的很难让它工作。
编辑:这是我到目前为止的代码,其中processArray是上面列出的数组。
var returnObj = {};
for(var x=0; x < processArray.length; x++){
//Check if we already have the array item as a key in the return obj
returnObj[processArray[x]] = returnObj[processArray[x]] || processArray[x].toString();
// Setup the count field
returnObj[processArray[x]].count = returnObj[processArray[x]].count || 1;
// Increment the count
returnObj[processArray[x]].count = returnObj[processArray[x]].count + 1;
}
console.log('====================' + JSON.stringify(returnObj));
答案 0 :(得分:27)
例如:
counter = {}
yourArray.forEach(function(obj) {
var key = JSON.stringify(obj)
counter[key] = (counter[key] || 0) + 1
})
答案 1 :(得分:2)
Object.prototype.equals = function(o){
for(var key in o)
if(o.hasOwnProperty(key) && this.hasOwnProperty(key))
if(this[key] != o[key])
return false;
return true;
}
var array = [/*initial array*/],
newArray = [],
ok = true;
for(var i=0,l=array.length-1;i<l;i++)
for(var j=i;j<l+1;j++)
{
if(!array[i].equals(array[j]))
newArray.push(array[i]);
}
答案 2 :(得分:0)
使用 ES6,可以将 Array#reduce
与对象一起使用来存储计数。
let counts = arr.reduce((acc, curr)=>{
const str = JSON.stringify(curr);
acc[str] = (acc[str] || 0) + 1;
return acc;
}, {});
要创建一个没有重复的新数组,可以将 Set
与 Array#filter
一起使用。
let set = new Set;
let res = arr.filter(x => {
const str = JSON.stringify(x);
return !set.has(str) && set.add(str);
});