按数组key分组并以该key为新数组索引的实现需求
如何按指定key(term_id)将数组分组并生成目标结构?
嘿,这事儿好办!我来教你怎么把数组按term_id分组,生成你想要的新结构~
先再明确下你的需求:
原数组示例:
const array1 = [ { term_id: "1", capacity: "11", price: "452" }, { term_id: "2", capacity: "33", price: "44" }, { term_id: "1", capacity: "1", price: "2" } ];期望生成的新数组:
const array2 = { "1": { terms: [ { capacity: "11", price: "452" }, { capacity: "1", price: "2" } ] }, "2": { terms: [ { capacity: "33", price: "44" } ] } };
方案一:JavaScript 实现(用reduce方法)
这是前端场景下最常用的高效解法,利用数组的reduce方法一步到位:
const array1 = [ { term_id: "1", capacity: "11", price: "452" }, { term_id: "2", capacity: "33", price: "44" }, { term_id: "1", capacity: "1", price: "2" } ]; const array2 = array1.reduce((acc, currentItem) => { // 取出当前项的term_id作为新数组的索引 const termId = currentItem.term_id; // 如果当前索引在结果对象中不存在,先初始化一个带空terms数组的结构 if (!acc[termId]) { acc[termId] = { terms: [] }; } // 把当前项的capacity和price提取出来,push到对应索引的terms数组里 acc[termId].terms.push({ capacity: currentItem.capacity, price: currentItem.price }); return acc; }, {}); // 初始值是一个空对象,用来存储最终分组结果 console.log(array2);
代码解释:
reduce会遍历原数组的每一项,acc是我们用来累积结果的对象,初始值为{}。- 每遍历一个元素,先拿到它的
term_id作为键。 - 如果这个键还没在
acc里,就先创建一个包含terms空数组的对象。 - 然后把当前元素的
capacity和price提取出来,添加到对应键的terms数组中。 - 循环结束后,
acc就是你要的最终结构啦~
方案二:PHP 实现(用foreach循环)
如果是后端PHP场景,用foreach循环也能轻松实现:
$array1 = [ ['term_id' => '1', 'capacity' => '11', 'price' => '452'], ['term_id' => '2', 'capacity' => '33', 'price' => '44'], ['term_id' => '1', 'capacity' => '1', 'price' => '2'] ]; $array2 = []; foreach ($array1 as $item) { $termId = $item['term_id']; // 检查当前term_id是否已存在于结果数组中,不存在则初始化 if (!isset($array2[$termId])) { $array2[$termId] = ['terms' => []]; } // 将当前项的capacity和price加入对应terms数组 $array2[$termId]['terms'][] = [ 'capacity' => $item['capacity'], 'price' => $item['price'] ]; } print_r($array2);
运行这段代码后,输出的结果完全符合你的期望~
内容的提问来源于stack exchange,提问作者Dhiraj
相关产品推荐
相关产品推荐

