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中内置了任何东西来进行这种处理。您必须使用某种循环,但这些库可以很好地将其自动化。我发现我自己的函数还有改进的余地:)我正在循环每一个主题都有一个大的数据集-我应该用另一种方式来做显然…谢谢!