0

以下の構造に似た配列を反復処理しようとしています。同じ ID を持つオブジェクトごとに、それらを 1 つのオブジェクトに結合しますが、その ID に関連付けられたすべての「名前」の配列を使用します。私の配列はIDで事前にソートされており、JQueryを使用できず、バニラJSのみを使用できます.

これを変換します:

var array = [
   {id=1, name = "Orange"},
   {id=1, name = "Blue"},
   {id=1, name = "Green"},
   {id=2, name = "Blue"},
   {id=3, name = "Orange"},
   {id=3, name = "Blue"}
]

これに:

var newArray = [
   {id=1, nameList = [Orange, Blue, Green]},
   {id=2, nameList = [Blue]},
   {id=3, namelist = [Orange, Blue]}
]

最初のオブジェクトを配列内の次のオブジェクトと比較し、最初のオブジェクトを 2 番目のオブジェクトに設定することで、このようなことをしようとしましたが、「secondObject」が実際には配列内の次のオブジェクトではなかったため、行き詰まりました。

for (var i in array) {
   firstObject = array[i];
   secondObject = array[i + 1];
   if (firstObject.id === secondObject.id) {
      firstObject['nameList'] = [firstObject.name + ',' + secondObject.name]

    } else {
    continue;
    }
  firstObject = secondObject;


}

数千の ID でこれを行う必要があり、ほとんどの ID は異なる名前で繰り返されますが、ID 2 のような単一の ID オブジェクトがいくつかあります。

4

3 に答える 3

2

別の方法は、関数を使用することですreduce

var array = [   {id:1, name : "Orange"},   {id:1, name : "Blue"},   {id:1, name : "Green"},   {id:2, name : "Blue"},   {id:3, name : "Orange"},   {id:3, name : "Blue"}]

var result = Object.values(array.reduce((a, c) => {
  (a[c.id] || (a[c.id] = {id: c.id, nameList: []})).nameList.push(c.name);
  return a;
}, {}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

于 2018-03-21T19:03:06.917 に答える
1

アイテムがソートされているため、結果配列の最後のアイテムを確認し、実際のアイテムと異なる場合は新しい結果オブジェクトを生成できます。後でプッシュしnameます。

var array = [{ id: 1, name: "Orange" }, { id: 1, name: "Blue" }, { id: 1, name: "Green" }, { id: 2, name: "Blue" }, { id: 3, name: "Orange" }, { id: 3, name: "Blue" }],
    grouped = array.reduce(function (r, { id, name }) {
        if (!r.length || r[r.length - 1].id !== id) {
            r.push({ id, namelist: [] });
        }
        r[r.length - 1].namelist.push(name);
        return r;
    }, []);

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

于 2018-03-21T19:11:07.510 に答える