将数组转换为带有对象的数组

时间:2016-12-22 00:10:23

标签: javascript arrays json underscore.js

我一直在试图弄清楚如何将数组转换为带有对象的数组。

例如我有一个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}]

我尝试了一些事情,但我得到的只是悲剧,一切都破了,有没有人知道是否有任何图书馆或任何可以帮助这类事情的东西?

3 个答案:

答案 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();