10

サーバーサイド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));
4

4 に答える 4

33

例えば:

counter = {}

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

ドキュメント:Array.forEachJSON.stringify

于 2012-05-10T19:56:07.113 に答える
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]);
    }
于 2012-05-10T19:53:21.733 に答える
1

そのようなオブジェクトの配列を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));

もっと知る

于 2021-12-17T18:04:23.840 に答える
0

ES6ではArray#reduce、オブジェクトとともに使用してカウントを保存できます。

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

Demo

重複のない新しい配列を作成するには、aを。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

于 2021-04-11T16:07:42.597 に答える