如何将对象分组为下划线中的一个对象

时间:2015-11-11 22:37:11

标签: javascript arrays underscore.js

如何转换:

[
  {name: 'foo', type: 'product'},
  {name: 'bar', type: 'product'},
  {name: 'john', type: 'product'},
  {name: 'no name', type: 'product'},
]

如何分组并获取所有没有名称的对象:'没有名称'像这样单独的对象:

{  
  0:[
    {name: 'foo', type: 'product'},
    {name: 'bar', type: 'product'},
    {name: 'john', type: 'product'}
  ],

  1:[
    {name: 'no name', type: 'product'},
  ]
}

5 个答案:

答案 0 :(得分:2)

要制作包含键01的对象,请使用_.groupBy

var objectResult = _.groupBy(data, function(d) { return +(d.name === "no name")  })

要生成包含两个元素的数组(也将包含键01),您可以使用_.partition(Underscore 1.6.0 +):

  

partition_.partition(array, predicate):将数组拆分为两个数组:   一个元素都满足谓词,一个元素都满足谓词   不满足谓词。

var arrayResult = _.partition(data, function(d) { return d.name !== "no name"  })

JSBin

答案 1 :(得分:1)

作为比较,普通ECMAScript只需要更多代码:

data.reduce(function(acc, obj) {
  acc[obj.name == 'no name'? 1:0].push(obj);
  return acc;},{0:[],1:[]}
);

答案 2 :(得分:0)

您可以尝试http://underscorejs.org/#groupBy

var data = [
  {name: 'foo', type: 'product'},
  {name: 'bar', type: 'product'},
  {name: 'john', type: 'product'},
  {name: 'no name', type: 'product'},
]

var results = _.groupBy(data, function(obj) { return obj.name == 'no name' ? 1 : 0; })

console.log(results)

答案 3 :(得分:0)

你可以这样试试。

var arr = [
 {name: 'foo', type: 'product'},
 {name: 'bar', type: 'product'},
 {name: 'john', type: 'product'},
 {name: 'no name', type: 'product'},
];

var result = _.groupBy(arr, function (elem) { 
 return elem.name == 'no name' ? 1: 0;
});

答案 4 :(得分:0)

为什么要使用框架来做这么简单的事情? 这是一个纯粹的JS解决方案,允许groupBy正确。 然后很容易使用结果对象。

var array=[
  {name: 'foo', type: 'product'},
  {name: 'bar', type: 'product'},
  {name: 'john', type: 'product'},
  {name: 'no name', type: 'product'},
  {name: 'foo', type: 'product'},
  {name: 'bar', type: 'product'},
  {name: 'john', type: 'product'},
  {name: 'no name', type: 'product'},
  {name: 'no name', type: 'product'},
  {name: 'no name', type: 'product'},
  {name: 'no name', type: 'product'},
];        

function groupBy(propertyName, array) {
var groupedElements = {};
for (var i = 0, len = array.length; i < len; i++) {
    var el = array[i];
    var value = el[propertyName].trim();
    var group = groupedElements[value];
    if (group === undefined) {
        group = [el];
        groupedElements[value] = group;
    } else {
        group.push(el);
    }
}
return groupedElements;
}

var result = groupBy('name',array);