将数组中带有simular id的单独对象分成新数组

时间:2016-04-12 07:58:45

标签: javascript jquery angularjs

如果我有一个对象数组

var myArray = []

填充

var myObject = { 
id: 1,  
name: 'example'
}

让我们说'myArray'有6个'myObjects',其中一半共享相同的id,我想要一个用id分隔'myObjects'的函数,这样我就可以将它们传递给另一个需要id的函数分开。

myArray数据有一个rythme。

2 * 3(6)'myObjects'的例子,其中一半有一个相似的id:[id:1,id:2,id:3,id:1,id:2,id:3]

我希望它成为3个阵列。 [id:1,id:1] [id:2,id2] [id:3,id:3]

我怎样才能以简单有效的方式做到这一点?

5 个答案:

答案 0 :(得分:1)

这是一个提案,其中有一个临时对象作为对分组ID的项目的引用。



var data = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 1 }, { id: 2 }, { id: 3 }],
    result = [];

data.forEach(function (a) {
    if (!this[a.id]) {
        this[a.id] = [];
        result.push(this[a.id]);
    }
    this[a.id].push(a);
}, {});

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以使用lodash及其_.groupBy()方法。像这样:

const sorted = _.groupBy(myArray, 'id');

(未经测试顺便说一句)

答案 2 :(得分:0)

试试这个,输出是数组数组。

&#13;
&#13;
&#13;
var myArray = [
{id: 1,name: 'example'},
{id: 2,name: 'example'}, 
{id: 3,name: 'example'}, 
{id: 1,name: 'example'},
{id: 2,name: 'example'}, 
{id: 3,name: 'example'}, 
{id: 1,name: 'example'},
{id: 2,name: 'example'}, 
{id: 3,name: 'example'}
]

var tempObj = {};

$.each(myArray, function(index, value) {
  if (!tempObj[value.id]) {
    tempObj[value.id] = [];
  }
  tempObj[value.id].push(value);
});

finalArray = []
$.each(tempObj, function(i, v) {
  finalArray.push(v);
});

document.write(JSON.stringify(finalArray));
&#13;
&#13;
&#13;

答案 3 :(得分:0)

未优化,但是工作示例:

var array = [{id:1},{id:2},{id:3},{id:1},{id:2},{id:3}];

var resultObj = {};
var resultArray = [];

array.forEach(function(x) {
  //get the id
  var id = x.id;
  //if id is unknown, add new key to resultObj
  if (!resultObj.hasOwnProperty(id)) {
    resultObj[id] = [];
  }
  //add object to id
  resultObj[id].push(x);
});

//loop over resultObj keys
for (var key in resultObj) {
    if (resultObj.hasOwnProperty(key)) {
    //push array to 2dArray
    resultArray.push(resultObj[key]);
  }
}

//show results
console.log(resultObj);//{1:[{id:1}, {id:1}], 2:[...], ...]}
console.log(resultArray);//[[{id:1}, {id:1}], [...], ...]

小提琴:https://jsfiddle.net/zdtddc7f/

答案 4 :(得分:0)

这是一个Vanilla JavaScript版本,它可以完成整理,但它可以完成工作。

所有这一切都是循环array objects loopidobject的{​​{1}}推送到临时array (跟踪ids)在array中使用masterArr创建一个新的object,在每个后续loop上检查是否存在id存在相同array的条目,如果它确实将其添加到正确的位置,则会创建一个包含object的新id并跟踪idArr中的function filterArray(arr) { var masterArr = [], idArr = []; for (var i = 0, len = arr.length; i < len; i++) { if (i === 0) { idArr.push(arr[i].id); masterArr.push([arr[i]]); } else { var idCheck = idArr.indexOf(arr[i].id); if (idCheck > -1) { masterArr[idCheck].push(arr[i]); } else { idArr.push(arr[i].id); masterArr.push([arr[i]]); } } } return masterArr; } 1}}再次。

var mappedArray = filterArray(myArray);

然后你就像这样称呼它

TextInput

https://jsfiddle.net/m4x2boyw/