将数组转换为包含对象的数组

turning an array into an array with objects

我一直在想办法把一个数组变成一个包含对象的数组。

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

所以我应用了 underscore.js 库中的 _.countBy 函数,我得到了一个像这样的对象

{"john doe":2,"john doeeeeeeee":1}

我一直在想办法把它变成一个带有对象的数组,所以它看起来像这样,但我每次尝试都失败了,我不知道该从哪里开始

[{operator:"john doe",
 count: 2},
{operator: "john doeeeeeeee",
count:1}]

我已经尝试了一些方法,但我得到的只是悲剧,一切都坏了,有谁知道是否有任何图书馆或任何东西可以帮助解决这类问题?

给定 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 解决方案。)

进一步阅读:

给定你的初始数据数组,你可以运行这样:

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));

这是一种未经测试的下划线方法,它采用从 JSON 文件加载的初始值并直接转换为所需的输出格式:

_.chain(input)
 .groupBy(function(entry) { return entry.operator })
 .map(function(entries, operator) { 
        return {
           operator: operator,
           count: entries.length
        }   
      })
 .value();