最高效的对象数组分组方法
P粉310754094
2023-08-21 14:34:06
<p>什么是在数组中分组对象的最有效方法?</p>
<p>例如,给定以下对象数组:</p>
<pre class="brush:php;toolbar:false;">[
{ 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" }
]</pre>
<p>我正在一个表格中显示这些信息。我想按不同的方法进行分组,但我想要对值进行求和。</p>
<p>我正在使用Underscore.js的groupby函数,它很有帮助,但并不能完全满足需求,因为我不想把它们“分开”,而是“合并”,更像SQL的group by方法。</p>
<p>我想要的是能够对特定的值进行求和(如果需要的话)。</p>
<p>所以,如果我按<code>Phase</code>进行分组,我想要得到:</p>
<pre class="brush:php;toolbar:false;">[
{ Phase: "Phase 1", Value: 50 },
{ Phase: "Phase 2", Value: 130 }
]</pre>
<p>如果我按<code>Phase</code> / <code>Step</code>进行分组,我想要得到:</p>
<pre class="brush:php;toolbar:false;">[
{ 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 }
]</pre>
<p>是否有一个有用的脚本可以实现这个功能,或者我应该继续使用Underscore.js,然后通过循环遍历结果对象来进行求和?</p>
使用ES6的Map对象:
关于Map: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
如果您想避免使用外部库,可以简洁地实现一个原生版本的
groupBy()
,如下所示: