配列を値(この場合は)で新しい配列のセットに変換しようとしていますid
。
入力
let array = [
{"item": {"id": 111, "name": "item1"}, "qty": 1},
{"item": {"id": 222, "name": "item2"}, "qty": 2},
{"item": {"id": 222, "name": "item3"}, "qty": 3}
];
必要な出力
let newArray = [
[{"item": {"id": 111, "name": "item1"}, "qty": 1}],
[{"item": {"id": 222, "name": "item2"}, "qty": 2},
{"item": {"id": 222, "name": "item3"}, "qty": 3}]
];
標準groupBy
関数を使用して、でソートされた2つの配列を返すことができますid
。
function groupItemBy(array, property) {
var hash = {};
for (var i = 0; i < array.length; i++) {
if (!hash[array[i][property]]) hash[array[i][property]] = [];
hash[array[i][property]].push(array[i]);
}
return hash;
}
ただし、これらを新しい配列にマップしようとすると、ネストされたqty
データは失われます。
function parse() {
let tmp = Object.values(groupItemBy(array.map(el => el.item), "id"));
tmp.forEach(item => {
console.log(item);
// do something with each item in array
})
}
実際の出力
let newArray = [
[{{"id": 111, "name": "item1"}],
[{"id": 222, "name": "item2"},
{"id": 222, "name": "item3"}]
];
元の配列をソートされた配列の配列にグループ化するときに、関連するデータの整合性をどのように維持できますか?
これが機能するためには、キープロパティがどこにあるかを関数に何らかの方法で伝える必要があります。非常に複雑なネストされたオブジェクトを想像することができ、いくつかは同じプロパティ名を持っている可能性があるため、そのような指定がない場合はあいまいになる可能性さえあります。
これに取り組む1つの方法は、関数にドットで区切られたプロパティ(1つの文字列内)を認識させることです。これは一種の「パス」です。あなたの場合、それはですitem.id
。その情報を使用して、関数はid
(ネストされたオブジェクト内のitem
)値を探す場所を知ることができます。
明らかに、関数はその文字列をそれらのドットで分割します。次にreduce
、結果のプロパティ名の配列に対してを実行して、配列内の各オブジェクトのキー値を見つけることができます。
これがどのように見えるかです:
let cart = [{"item": {"id": 111,"name": "item1", }, "qty": 10,}, {"item": {"id": 222,"name": "item2"},"qty": 1}, {"item": {"id": 222,"name": "item3"},"qty": 1,}];
function groupItemBy(array, property) {
var hash = {},
props = property.split('.');
for (var i = 0; i < array.length; i++) {
var key = props.reduce(function(acc, prop) {
return acc && acc[prop];
}, array[i]);
if (!hash[key]) hash[key] = [];
hash[key].push(array[i]);
}
return hash;
}
let grouped = Object.values(groupItemBy(cart, 'item.id'));
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加