オブジェクトの配列でグループ化するための最も効率的な方法-JavaScript
このようなオブジェクトの配列があるとします-
const arr = [ { Phase: "Phase 1", Step: "Step 1", Task: "Task 1", Value: "5" }, { Phase: "Phase 1", Step: "Step 1", Task: "Task 2", Value: "10" }, { Phase: "Phase 1", Step: "Step 2", Task: "Task 1", Value: "15" }, { Phase: "Phase 1", Step: "Step 2", Task: "Task 2", Value: "20" }, { Phase: "Phase 2", Step: "Step 1", Task: "Task 1", Value: "25" }, { Phase: "Phase 2", Step: "Step 1", Task: "Task 2", Value: "30" }, { Phase: "Phase 2", Step: "Step 2", Task: "Task 1", Value: "35" }, { Phase: "Phase 2", Step: "Step 2", Task: "Task 2", Value: "40" } ];
最初の引数としてそのような配列を1つ受け取るJavaScript関数を作成する必要があります。
私たちの目的は、複数または1つの単一のプロパティ(2番目、3番目の引数で示される)に基づいて特定の配列をグループ化できるようにすることです。
したがって、グループバイフェーズを実行した場合、-
を受け取る必要があります。const output = [ { Phase: "Phase 1", Value: 50 }, { Phase: "Phase 2", Value: 130 } ];
そして、グループ化されたフェーズ/ステップを実行した場合、-
を受け取る必要があります。const output = [ { Phase: "Phase 1", Step: "Step 1", Value: 15 }, { Phase: "Phase 1", Step: "Step 2", Value: 35 }, { Phase: "Phase 2", Step: "Step 1", Value: 55 }, { Phase: "Phase 2", Step: "Step 2", Value: 75 } ];
例
このためのコードは-
になりますconst arr = [ { Phase: "Phase 1", Step: "Step 1", Task: "Task 1", Value: "5" }, { Phase: "Phase 1", Step: "Step 1", Task: "Task 2", Value: "10" }, { Phase: "Phase 1", Step: "Step 2", Task: "Task 1", Value: "15" }, { Phase: "Phase 1", Step: "Step 2", Task: "Task 2", Value: "20" }, { Phase: "Phase 2", Step: "Step 1", Task: "Task 1", Value: "25" }, { Phase: "Phase 2", Step: "Step 1", Task: "Task 2", Value: "30" }, { Phase: "Phase 2", Step: "Step 2", Task: "Task 1", Value: "35" }, { Phase: "Phase 2", Step: "Step 2", Task: "Task 2", Value: "40" } ]; const groupBy = (array, groups, valueKey) => { const map = new Map; groups = [].concat(groups); return array.reduce((acc, val) => { groups.reduce((accu, value, ind, { length }) => { let child; if (accu.has(val[value])) { return accu.get(val[value]); }; if (ind + 1 === length) { child = Object .assign(...groups.map(value => ({ [value]: val[value] })), { [valueKey]: 0 }); acc.push(child); } else { child = new Map; }; accu.set(val[value], child); return child; }, map)[valueKey] += +val[valueKey]; return acc; }, []); }; console.log(groupBy(arr, 'Phase', 'Value')); console.log(groupBy(arr, ['Phase', 'Step'], 'Value'));
出力
そして、コンソールの出力は-
になります[ { Phase: 'Phase 1', Value: 50 }, { Phase: 'Phase 2', Value: 130 } ] [ { Phase: 'Phase 1', Step: 'Step 1', Value: 15 }, { Phase: 'Phase 1', Step: 'Step 2', Value: 35 }, { Phase: 'Phase 2', Step: 'Step 1', Value: 55 }, { Phase: 'Phase 2', Step: 'Step 2', Value: 75 } ]
-
配列内のJavaScriptオブジェクト間でメソッドを共有できますか?
以下は、配列内のオブジェクト間でメソッドを共有するためのコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <style>  
-
JavaScriptオブジェクトの配列で配列のメソッドを使用していますか?
以下は、JavaScriptオブジェクトの配列で配列のメソッドを使用するためのコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <styl