减少多维数组

时间:2017-10-18 14:55:44

标签: javascript arrays multidimensional-array mapreduce

我目前正在尝试映射和缩小函数以展平多维数组 这是一个模拟示例数据集:

data: [
  {
    label: "Sort-01"
    data: [
      {
        label: "OCT-2017"
        weight: 2304
      },
      {
        label: "NOV-2017"
        weight: 1783
      }
    ]
  },
  {
    label: "Sort-02"
    data: [
      {
        label: "OCT-2017"
        weight: 4785
      },
      {
        label: "NOV-2017"
        weight: 102
      }
    ]
  },
 ......
]

我知道为了按照排序编号进行map-reduce我可以使用:

data.map(sort => sort.data.reduce((a,b) => a.weight + b.weight));

但是,我希望按月减少排序编号 我将不胜感激任何帮助。

谢谢,

2 个答案:

答案 0 :(得分:2)

使用Array#map获取data属性数组的数组,然后使用Array#concatspread展平。使用Array#reduce将值收集到Map,然后使用Map#values和扩展语法转换回数组:



const array = [{"label":"Sort-01","data":[{"label":"OCT-2017","weight":2304},{"label":"NOV-2017","weight":1783}]},{"label":"Sort-02","data":[{"label":"OCT-2017","weight":4785},{"label":"NOV-2017","weight":102}]}];

const result = [... // spread the values iterator to an array
  [].concat(...array.map(({ data }) => data)) // map the array into an array of data arrays
  .reduce((m, { label, weight }) => {
    // take item if label exists in map, if not create new
    const item = m.get(label) || { label, weight: 0 };
    
    item.weight += weight; // add the weight
  
    return m.set(label, item); // set the item in the map
  }, new Map).values()] // get the values iterator

console.log(result);




这是一个无散布的版本:



const array = [{"label":"Sort-01","data":[{"label":"OCT-2017","weight":2304},{"label":"NOV-2017","weight":1783}]},{"label":"Sort-02","data":[{"label":"OCT-2017","weight":4785},{"label":"NOV-2017","weight":102}]}];

const helper = Object.create(null);
const result = [].concat.apply([], array.map(({ data }) => data)) // map the array into an array of data arrays, and flatten by apply concat
  .reduce((r, { label, weight }) => {
    // if label is not in helper, add to helper, and push to r
    if(!helper[label]) {
      helper[label] = { label, weight: 0 };
      r.push(helper[label]);
    }
    
    helper[label].weight += weight; // add the weight to the object
  
    return r;
  }, []) // get the values iterator

console.log(result);




答案 1 :(得分:1)

您可以使用reduce或concat (see Ori's answer)来获取展平的数据数组。从那里重新分配您的年份标签作为关键和重量作为价值。 然后传递给另一个减速器,以便按月计算你的重量。

SELECT min(id) as id,manager,company,city 
FROM DistinctResult
group by company,city;