我一直在试图弄清楚如何将数组转换为带有对象的数组。
例如我有一个json文件开头,json文件看起来像这样
var data=[{"tasknumber":304030,
"date":"2012-05-05",
"operator":"john doe"},
{"tasknumber":23130,
"date":"2012-07-07",
"operator":"john doeeeeeeee"},
{"tasknumber":233330,
"date":"2012-08-08",
"operator":"john doe"}]
所以我应用了undercore.js库中的_.countBy函数,我得到了一个像这样的对象
{"john doe":2,"john doeeeeeeee":1}
我一直试图弄清楚如何把它变成一个带有物体的数组,所以它看起来像这样,但我在每次尝试都失败了,我不知道要开始
[{operator:"john doe",
count: 2},
{operator: "john doeeeeeeee",
count:1}]
我尝试了一些事情,但我得到的只是悲剧,一切都破了,有没有人知道是否有任何图书馆或任何可以帮助这类事情的东西?
答案 0 :(得分:3)
如果输入 object (不是数组){"john doe":2,"john doeeeeeeee":1}
,您可以得到所需的输出:
var input = {"john doe":2,"john doeeeeeeee":1};
var output = Object.keys(input).map(function(k) {
return {
operator: k,
count: input[k]
};
});
console.log(output);

或者使用ES6箭头函数语法:
var input = {"john doe":2,"john doeeeeeeee":1};
var output = Object.keys(input).map((k) => ({ operator: k, count: input[k] }) );
console.log(output);

(请注意,Underscore可能提供了一种更短的方式来实现这一点,但我不熟悉Underscore,所以我只给出了一个简单的JS解决方案。)
进一步阅读:
答案 1 :(得分:0)
鉴于您的初始数据阵列,您可以运行:
var data=[{"tasknumber":304030,
"date":"2012-05-05",
"operator":"john doe"},
{"tasknumber":23130,
"date":"2012-07-07",
"operator":"john doeeeeeeee"},
{"tasknumber":233330,
"date":"2012-08-08",
"operator":"john doe"}];
功能定义
const count = data => {
// get data in format like _.countBy
const o = data.map(x => x.operator).reduce((acc, cur) => { acc[cur] ? acc[cur] += 1 : acc[cur] = 1; return acc; }, {});
// transform object into array of object
return Object.keys(o).map(operator => ({operator, count: o[operator]}));
};
通过产生输出
来测试它console.log(count(data));
答案 2 :(得分:0)
这是一个未经测试的下划线方法,它将您的初始值从JSON文件加载并直接转换为您想要的输出格式:
_.chain(input)
.groupBy(function(entry) { return entry.operator })
.map(function(entries, operator) {
return {
operator: operator,
count: entries.length
}
})
.value();