在一个对象数组中计算重复项数量

12

我在服务器端的JS中有一个对象数组,如下所示:

[
    {
        "Company": "IBM"
    },
    {
        "Person": "ACORD LOMA"
    },
    {
        "Company": "IBM"
    },
    {
        "Company": "MSFT"
    },
    {
        "Place": "New York"
    }
]
我需要遍历这个结构,检测任何重复项,然后在每个值旁边创建一个计数,以便发现重复项。
为了被视为重复项,两个值必须匹配,例如 "Company": "IBM" 不与 "Company": "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));

为什么别人要替你做这项工作呢? - Travis J
@RoyiNamir:哈哈哈,那不是我 :) - Sarfraz
你在谈论哪两个值?每个对象只有一个值...如果你已经知道你必须迭代列表,那么你遇到了什么问题? - Felix Kling
非常抱歉没有发布我的测试代码。请查看附加编辑。 - Ben
4个回答

37
例如:
counter = {}

yourArray.forEach(function(obj) {
    var key = JSON.stringify(obj)
    counter[key] = (counter[key] || 0) + 1
})

文档:Array.forEachJSON.stringify


你好,能否解释一下这行代码 (counter[key] || 0) + 1,我以前从未见过。 - Kem Bardly
如果计数器[key]不存在,则使用0。 - ilumin
2
如果我想返回一个对象数组而不是一个对象怎么办? - Alfrex92

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]);
    }

1
我们需要编写一个 JavaScript 函数,接受一个包含对象的数组作为参数。该函数应创建并返回一个新的数组,其中没有重复的对象(所谓重复指的是具有相同"Country"属性值的对象)。
此外,该函数还应为每个对象分配一个 count 属性,该属性表示它们在原始数组中出现的次数。
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


太棒了!正是我正在寻找的。谢谢。 - Aqeel iqbal

0

使用ES6,可以使用{{link1:Array#reduce}}与对象一起存储计数。

let counts = arr.reduce((acc, curr)=>{
   const str = JSON.stringify(curr);
   acc[str] = (acc[str] || 0) + 1;
   return acc;
}, {});

演示

为了创建一个没有重复项的新数组,可以使用SetArray#filter

let set = new Set;
let res = arr.filter(x => {
  const str = JSON.stringify(x);
  return !set.has(str) && set.add(str);
});

演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接