Javascript 什么';用更大的数据数组填充对象数组属性的最有效方法是什么?

Javascript 什么';用更大的数据数组填充对象数组属性的最有效方法是什么?,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我有一个具有属性的小对象数组,如下所示: [ { topicName: 'Clicks', topic: 1, dates: [ <PLACE VALUES HERE> ], }, { topicName: 'Cost', topic: 2, dates: [ <PLACE VALUES HERE> ], }, ]; [ { topic

我有一个具有属性的小对象数组,如下所示:

  [
    {
      topicName: 'Clicks',
      topic: 1,
      dates: [ <PLACE VALUES HERE> ],
    },
    {
      topicName: 'Cost',
      topic: 2,
      dates: [ <PLACE VALUES HERE> ],
    },
  ];
  [
    {
      topicName: 'Clicks',
      topic: 1,
      dates: [
        {
          date: '2014-02-01',
          value: 104
        },
        {
          date: '2014-02-02',
          value: 40
        }
      ],
    },
    {
      topicName: 'Cost',
      topic: 2,
      dates: [
        {
          date: '2014-02-01',
          value: 284,3519401
        },
        {
          date: '2014-02-02',
          value: 190
        }
      ],
    },
  ];
现在我需要最后一个数组的所有成员的数据,并在第一个数组中插入特定对象的相关数据(必要时求和),如下所示:

  [
    {
      topicName: 'Clicks',
      topic: 1,
      dates: [ <PLACE VALUES HERE> ],
    },
    {
      topicName: 'Cost',
      topic: 2,
      dates: [ <PLACE VALUES HERE> ],
    },
  ];
  [
    {
      topicName: 'Clicks',
      topic: 1,
      dates: [
        {
          date: '2014-02-01',
          value: 104
        },
        {
          date: '2014-02-02',
          value: 40
        }
      ],
    },
    {
      topicName: 'Cost',
      topic: 2,
      dates: [
        {
          date: '2014-02-01',
          value: 284,3519401
        },
        {
          date: '2014-02-02',
          value: 190
        }
      ],
    },
  ];
目标是最新版本的Chrome,我正在使用Babel的Webpack,所以所有最新的东西都是可用的

假设最后一个数据集非常大,那么最有效的方法是什么

[编辑]

这就是我到目前为止的想法:

const dataAdapter = rawData => {
  const topics = ['clicks', 'revenue', 'cost', 'roi'];
  const topicsData = topics.map((topic, index) => {
    const thisTopic = {};

    thisTopic.topicName = topic;
    thisTopic.topic = index;
    thisTopic.dates = [];

    return thisTopic;
  });

  const convertedData = topicsData.map(topicData => {
    const thisTopic = topicData;
    const map = new Map();

    rawData.forEach(elem => {
      map.set(elem.date, (map.get(elem.date) || 0) + elem[[thisTopic.topicName]]);
    });

    thisTopic.dates = Array.from(map);

    return thisTopic;
  });

  return convertedData;
};
谢谢


/J

您可以将对象作为所需密钥和日期的参考。然后迭代数据并检查是否存在对结果集的引用。如果不是,则创建一个新的结果集

var result=[{topicName:'点击',主题:1,日期:[],},{topicName:'成本',主题:2,日期:[],}],
数据=[{日期:“2014-02-01”,设备:“计算机”,“匹配类型”:“NA”,点击次数:66次,收入:1037次,转换次数:2次,成本:284.35次,印象次数:5330次,投资回报率:3.64691401441885},{日期:“2014-02-01”,设备:“平板电脑”,“匹配类型”:“NA”,点击次数:38次,收入:587次,转换次数:2次,成本:19401000000000005次,印象次数:1934次,投资回报率:3.025617236224936},{日期:“2014-02-02”,设备:“平板电脑”,“匹配类型”:“NA”,点击次数:40次,收入:587次,转化率:2次,成本:190次,印象:1934次,投资回报率:3.025617236224936},
哈希={单击次数:{{uu:result[0]。日期},成本:{{uu:result[1]。日期},};
data.forEach(函数(o){
['clicks','cost'].forEach(函数(k){
如果(!散列[k][o.date]){
散列[k][o.date]={date:o.date,值:o[k]};
哈希[k]。u.push(哈希[k][o.date]);
返回;
}
散列[k][o.date]。值+=o[k];
});
});
console.log(结果);

.as控制台包装{max height:100%!important;top:0;}
假设您的数据位于
data
变量中,而主题位于
topics
变量中。此解决方案仅使用javascript内置对象

const getPropDateMap = (obj, prop) => obj
  .reduce((accObj, item) => {
    return Object.assign(accObj, {
      [item.date]: item.clicks + (accObj[item.date] || 0)
    })
  }, {})

topics.forEach(topic => {
  topic.dates = Object
    .entries(getPropDateMap(data, topic.topicName.toLowerCase()))
    .map(entry => ({date: entry[0], value: entry[1]}))
})

请添加您已经尝试过的。像underline.js和lodash这样的库是做这类事情的最简单方法。我不认为ES6中内置了任何东西来进行这种处理。您必须使用某种循环,但这些库可以很好地将其自动化。我发现我自己的函数还有改进的余地:)我正在循环每一个主题都有一个大的数据集-我应该用另一种方式来做显然…谢谢!