Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用javascript通过对象属性将数组拆分为数组?_Javascript_Arrays_Underscore.js - Fatal编程技术网

如何使用javascript通过对象属性将数组拆分为数组?

如何使用javascript通过对象属性将数组拆分为数组?,javascript,arrays,underscore.js,Javascript,Arrays,Underscore.js,我目前有一个类似于以下阵列的阵列: [ {id:1,color:'red'}, {id:2,color:'blue'}, {id:3,color:'red'}, {id:4,color:'green'}, {id:5,color:'blue'}, ] 我正在寻找一种最快的方法来获得下面这样的结果,我可以通过对象中的属性对数组进行拆分/排序,在本例中是“颜色”: [ [ {id:1,color:'red'},

我目前有一个类似于以下阵列的阵列:

[
      {id:1,color:'red'},
      {id:2,color:'blue'},
      {id:3,color:'red'},
      {id:4,color:'green'},
      {id:5,color:'blue'},
]
我正在寻找一种最快的方法来获得下面这样的结果,我可以通过对象中的属性对数组进行拆分/排序,在本例中是“颜色”:

[
      [
        {id:1,color:'red'},
        {id:3,color:'red'},
      ],[
        {id:2,color:'blue'},
        {id:5,color:'blue'},
      ],[
        {id:4,color:'green'},
    ]
]

我可以为此编写一个函数,但我认为在underline.js中可能已经有了这样的功能,但没有找到它。

您需要使用underline的
groupBy
函数,您可以在文档右侧找到它

groupBy\uu.groupBy(列表、迭代器、[context])
将集合拆分为 集合,按通过迭代器运行每个值的结果分组。如果 迭代器是字符串而不是函数,按属性分组 由每个值上的迭代器命名


您可以将
.groupBy
.toArray
功能结合使用:

var dict = [
      {id:1,color:'red'},
      {id:2,color:'blue'},
      {id:3,color:'red'},
      {id:4,color:'green'},
      {id:5,color:'blue'},
];

var grouped = _.groupBy(dict, function(x){ return x.color; });
var result = _.toArray(grouped);

您可以使用ES5功能获得所需的结果,而无需第三方库:

var data = [
      {id:1,color:'red'},
      {id:2,color:'blue'},
      {id:3,color:'red'},
      {id:4,color:'green'},
      {id:5,color:'blue'},
];

var temp = {};
data.forEach(function(item){
    if (temp[item.color]) { 
         temp[item.color].push(item);
     } else {
       temp[item.color] = [ item ]; }   
});

var result = Object.keys(temp).map(function(key){ return temp[key]; });

为了支持较旧的浏览器,请使用
groupBy
功能,该功能不生成请求的输出。尽管如此,OP可以很好地处理它。canon是正确的,它返回一个对象,但这也应该同样有效。谢谢。此操作的结果需要包装在
\uu.toArray()
中才能获得所需的输出
var data = [
      {id:1,color:'red'},
      {id:2,color:'blue'},
      {id:3,color:'red'},
      {id:4,color:'green'},
      {id:5,color:'blue'},
];

var temp = {};
data.forEach(function(item){
    if (temp[item.color]) { 
         temp[item.color].push(item);
     } else {
       temp[item.color] = [ item ]; }   
});

var result = Object.keys(temp).map(function(key){ return temp[key]; });