JavaScript将具有相同id的对象转换为对象数组

时间:2017-10-06 15:10:04

标签: javascript arrays

我从我的API获得此结果:

enter image description here

但是任何具有相同id的内容(如最后2个)我希望在一个对象中分组,因此数组中只有3个项目(0,1,2),最后一个项目将嵌套在最后一个,因为它有一个重复的ID。它从SQL中以正确的格式排序,所以我希望它保持它的顺序。

最多可能有50个具有相同ID但可能需要嵌套,我尝试使用数组和键但是无法获得所需的结果

if(data.length > 0){
    console.log(value);
     try{
         if(value.id == s[key - 1].id){
           console.log("match");
           s.push(value);
         } else {
            orderobj.push(s);
         }

      } catch(ex){}
        console.log(orderobj);
  } 

4 个答案:

答案 0 :(得分:1)

由于您的所有喜欢ID都是连续的,因此您可以在从API数据创建新集合时进行非常简单的检查。只需继续将对象添加到数组中,直到ID不再匹配,然后将该数组添加到父数组中。

var apiData = [
	{id: 1, text: '1asdf'},
  {id: 2, text: '2asdf'},
  {id: 3, text: '3asdf'},
  {id: 4, text: '4asdf'},
  {id: 4, text: '5asdf'},
];

var dataArray = [];

for(let i=0;i<apiData.length;++i) {
	var dataItem = [];
  
	dataItem.push(apiData[i]);
  
    while(i < apiData.length-1 && apiData[i].id === apiData[i+1].id) {
      ++i
      dataItem.push(apiData[i]);
    }

  dataArray.push(dataItem);
}

console.log('Final Array:', dataArray);

答案 1 :(得分:0)

我只是创建一个以ID作为键的对象映射,然后创建一个匹配对象数组作为值。然后按顺序循环对象键并从中创建一个数组:

let objectMap = data.reduce(function(o, i) {
    if (!o[i.id]) o[i.id] = [];
    o[i.id].push(i)

    return o;
}, {})

concat:

let sortedKeys = Object.keys(objectMap).sort();
let groupedData = sortedKeys.reduce(function(d, k) {
    d.push(objectMap[k]);
    return d;
}, []); //return format: [[{id:1}],[{id:2}],[{id:3},{id:3}]

答案 2 :(得分:0)

试试这个

    var apiData = [
	  {id: 1, text: '1asdf'},
      {id: 2, text: '2asdf'},
      {id: 3, text: '3asdf'},
      {id: 4, text: '4asdf'},
      {id: 4, text: '5asdf'},
    ];

    var result = [];
    apiData.forEach((item) => {
	  var saved = result.find((innerArr) => {
		return innerArr.find((innerItem) => innerItem.id === item.id) ? true : false;
	  })

	  if(saved){
		saved.push(item);
      } else {
		result.push([item]);
	  }
	
    })
    
    console.log(result);

答案 3 :(得分:0)

您可以使用array#reduce。您可以在共享相同id的数组中添加对象,然后使用Object.values()来获取所有对象。

var arr = [{id:'27', uid: '7', code: 'HV0010SML', productid: '1', datetime: '2017-10-06 15:57:17'},{id:'28', uid: '7', code: 'HV0010MED', productid: '1', datetime: '2017-10-06 15:57:17'},{id:'29', uid: '7', code: 'HV0010LGE', productid: '1', datetime: '2017-10-06 15:57:17'},{id:'29', uid: '7', code: 'HV0010LGE', productid: '1', datetime: '2017-10-06 15:57:17'}];

var combined = arr.reduce((hash, obj) => {
   return obj.id in hash ? hash[obj.id].push(obj) : hash[obj.id] = [obj], hash;
}, Object.create(null));

var result = Object.values(combined);
console.log(result);
.as-console-wrapper{max-height: 100% !important}