在 Node 中按 JSON 数据分组

aro*_*016 1 javascript json node.js underscore.js-templating

在我的 nodeJs 代码中,我从数据库中获取一些记录。我以 JSON 格式获取数据,如下所示:

"Data": [{
    "id": 1,
    "color": "blue",
    "model_name": "ford",
    "year": 2016
}, {
    "id": 2,
    "color": "blue",
    "model_name": "Maruti",
    "year": 2016
}, {
    "id": 3,
    "color": "red",
    "model_name": "Fiat",
    "year": 2016
}, {
    "id": 4,
    "color": "red",
    "model_name": "tata",
    "year": 2016
}]
Run Code Online (Sandbox Code Playgroud)

我想要的是类似于以下 JSON 的内容:

"Data": [{
    "color": "blue",
    car: [{
        "id": 1,
        "color": "blue",
        "model_name": "ford",
        "year": 2016
    }, {
        "id": 2,
        "color": "blue",
        "model_name": "Maruti",
        "year": 2016
    }]
}, {
    "color": "red",
    car: [{
        "id": 3,
        "color": "red",
        "model_name": "Fiat",
        "year": 2016
    }, {
        "id": 4,
        "color": "red",
        "model_name": "tata",
        "year": 2016
    }]
}]
Run Code Online (Sandbox Code Playgroud)

我可以使用下面的代码使用下划线 JS 的“groupBy”方法来实现这一点:

var groupedData = _.groupBy(rows, f=>{return f.color});
Run Code Online (Sandbox Code Playgroud)

但是输出变为:

"Data": [{
    "blue": [{
        "id": 1,
        "color": "blue",
        "model_name": "ford",
        "year": 2016
    }, {
        "id": 2,
        "color": "blue",
        "model_name": "Maruti",
        "year": 2016
    }]
}, {

    "red": [{
        "id": 3,
        "color": "red",
        "model_name": "Fiat",
        "year": 2016
    }, {
        "id": 4,
        "color": "red",
        "model_name": "tata",
        "year": 2016
    }]
}]
Run Code Online (Sandbox Code Playgroud)

这里的问题是颜色名称本身就是关键。我想要 "color": "blue" ,以这种格式但在一组中。

Red*_*edu 7

纯 ES6 代码的另一种直接方法。

var data = [
{
  "id": 1,
  "color": "blue",
  "model_name": "ford",
  "year": 2016
},
{
  "id": 2,
  "color": "blue",
  "model_name": "Maruti",
  "year": 2016
},
{
  "id": 3,
  "color": "red",
  "model_name": "Fiat",
  "year": 2016
},
{
  "id": 4,
  "color": "red",
  "model_name": "tata",
  "year": 2016
}],
    hash = data.reduce((p,c) => (p[c.color] ? p[c.color].push(c) : p[c.color] = [c],p) ,{}),
 newData = Object.keys(hash).map(k => ({color: k, car: hash[k]}));
console.log(newData);
Run Code Online (Sandbox Code Playgroud)