计算对象数组中的重复项
Posted
技术标签:
【中文标题】计算对象数组中的重复项【英文标题】:Count duplicates within an Array of Objects 【发布时间】:2012-05-19 10:37:35 【问题描述】:我的服务器端 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));
【问题讨论】:
Remove duplicates from an array of objects in javascript 的可能重复项 而为什么应该由其他人为您完成这项工作? @RoyiNamir: 哈哈哈不是我 :) 您说的是哪一个 both 值?每个对象只有一个值...如果您已经知道必须遍历列表,那么您遇到了什么问题? 很抱歉没有发布我的测试代码。请参阅附加编辑。 【参考方案1】:例如:
counter =
yourArray.forEach(function(obj)
var key = JSON.stringify(obj)
counter[key] = (counter[key] || 0) + 1
)
文档:Array.forEach、JSON.stringify。
【讨论】:
嗨,你能解释一下这一行吗 (counter[key] || 0) + 1 我以前从未见过。 如果 counter[key] 不存在则使用 0 代替 如果我想返回一个对象数组而不是一个对象怎么办?【参考方案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]);
【讨论】:
【参考方案3】:我们需要编写一个 JavaScript 函数来接收一个这样的对象数组。该函数创建并返回一个新数组,其中没有重复对象(重复我们的意思是“Country”属性具有相同值的对象。)
此外,该函数应为每个对象分配一个计数属性,表示它们在原始数组中出现的次数。
const arr = [
"Country": "BR",
"New Lv1−Lv2": "#N/A"
,
"Country": "BR",
"New Lv1−Lv2": "#N/A"
,
"Country": "",
"New Lv1−Lv2": "test"
];
const convert = (arr) =>
const res = ;
arr.forEach((obj) =>
const key = `$obj.Country$obj["New Lv1−Lv2"]`;
if (!res[key])
res[key] = ...obj, count: 0 ;
;
res[key].count += 1;
);
return Object.values(res);
;
console.log(convert(arr));
know more
【讨论】:
太棒了!正是我想要的。谢谢【参考方案4】:在 ES6 中,可以使用 Array#reduce
和对象来存储计数。
let counts = arr.reduce((acc, curr)=>
const str = JSON.stringify(curr);
acc[str] = (acc[str] || 0) + 1;
return acc;
, );
Demo
要创建不重复的新数组,Set
可以与 Array#filter
一起使用。
let set = new Set;
let res = arr.filter(x =>
const str = JSON.stringify(x);
return !set.has(str) && set.add(str);
);
Demo
【讨论】:
以上是关于计算对象数组中的重复项的主要内容,如果未能解决你的问题,请参考以下文章