首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >降维阵列

降维阵列
EN

Stack Overflow用户
提问于 2017-10-18 14:55:44
回答 2查看 2.9K关注 0票数 3

目前,我正试图映射和减少函数,以使多维数组变得平坦。

这是一个模拟示例数据集:

代码语言:javascript
复制
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
      }
    ]
  },
 ......
]

我知道,为了映射-按排序编号减少,我可以使用:

代码语言:javascript
复制
data.map(sort => sort.data.reduce((a,b) => a.weight + b.weight));

但是,我想按月减少,而不是排序。

我很感谢你的帮助。

谢谢,

杰伦

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-18 15:04:30

使用Array#map获取data属性数组的a数组,然后与Array#concat铺展一起扁平。使用Array#reduce将值收集到地图中,然后使用Map#values,并使用spread语法将其转换回数组:

代码语言:javascript
复制
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);

下面是一个无扩展的版本:

代码语言:javascript
复制
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);

票数 2
EN

Stack Overflow用户

发布于 2017-10-18 15:36:49

您可以使用reduce或(见Ori的答复)来获得扁平的数据数组。从那里重新分配你的年份标签作为关键和重量作为价值。然后转到另一个减速机,以便按月将你的重量加起来。

代码语言:javascript
复制
const 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,},],},];
const flatten = (acc, cur) => { 
  cur.data.forEach(val => acc.push(val)); 
  return acc;
};
const monthMap = ({ label, weight }) => ({ [label]: weight });
const reducer = (acc, cur) => {
  const key = Object.keys(cur)[0]
  if (!acc.hasOwnProperty(key)) { acc[key] = 0 }
  acc[key] += cur[key];
  return acc;
};

let x = data.reduce(flatten, []).map(monthMap).reduce(reducer, {});
console.log(x);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46813206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档