javascript - 在 Javascript 中从二维数组创建总计数组

标签 javascript arrays multidimensional-array

假设我有这个二维数组:

// [name, item, price]

var arr = [
    ['bob', 'book', '3'],
    ['mary', 'pencil', '2'],
    ['steve', 'book', '2'],
    ['steve', 'pencil', '1'],
    ['bob', 'book', '2']
];

我需要创建第二个数组,其中包含:

  1. 每个名字只能出现一次
  2. 每个名称的总计
  3. 对象数组,每个对象代表一个商品和相应的价格。

例如:

// [name, total_price, [ { item: item, price: price } ] ] 

totals = [
    ['bob', 5, [ { item: 'book', price: 3 }, { item: 'book', price: 2 } ] ],
    ['mary', 2, [ { item: 'pencil', price: 2 } ] ],
    ['steve', 3, [ { item: 'book', price: 2 }, { item: 'pencil', price: 1 } ] ] 
];

创建总计数组的最佳方法是什么?

此外,如果更有效的话,包含商品和价格的对象数组甚至可以只是一个二维数组,如下所示:

// [name, total_price, [ [item, price], [item, price], [item, price] ] ]

最佳答案

您可以使用Array.prototype.reduce 。例如,借助临时映射变量来存储数组索引:

var arr = [
    ['bob', 'book', '3'],
    ['mary', 'pencil', '2'],
    ['steve', 'book', '2'],
    ['steve', 'pencil', '1'],
    ['bob', 'book', '2']
];

var names = {};
var result = arr.reduce(function(prev, curr) { 
    if (names[curr[0]] === undefined) {
        prev.push([curr[0], 0, []]);
        names[curr[0]] = prev.length - 1;
    }
    var i = names[curr[0]];
    prev[i][1] += Number(curr[2]);
    prev[i][2].push({item: curr[1], price: curr[2]});
    return prev;
}, []);

document.write('<pre>' + JSON.stringify(result, null, 4));

关于javascript - 在 Javascript 中从二维数组创建总计数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32039332/

相关文章:

java-如何管理多个数据列表-在单个变量中-轻松访问每个列表

javascript - 鼠标移动时的 Canvas

javascript - 根据所选框单击提交按钮时网址未打开

javascript - 处理 Handlebars 上的 jQuery onClick 事件

java - java列表的数组索引越界异常错误

c# - foreach 是否在每次迭代时评估数组?

c - 矩阵中总和最大的行

php - Javascript 删除 JSON 元素

javascript - 努力重组 Json 数据结构

c++ - 修改函数中二维引用数组的值