1

I am trying to group my array by Id in jQuery, the details of my code and what I am trying to achieve.

My array is something like this:

var array = [
    {id:1, value:1}, 
    {id:1, value:2},
    {id:1, value:3},
    {id:2, value:4},
    {id:2, value:5},
    {id:2, value:6}, 
    {id:3, value:7},
    {id:3, value:8},
    {id:3, value:1},
    {id:4, value:2},
    {id:4, value:3},
    {id:4, value:4},
    {id:6, value:5},
    {id:6, value:1},
    {id:6, value:2},
    {id:12, value:3},
    {id:12, value:4},
    {id:12, value:5},
    {id:1, value:"a"},
    {id:1, value:"b"},
    {id:1, value:"c"},
    {id:2, value:4},
    {id:2, value:5},
];

desired result should be

var output = [
{
id:1,
group:[
    {value:1}, 
    {value:2},
    {value:3},
  ]
},
{
id:2,
group:[
    {value:4},
    {value:5},
    {value:6},
  ]
},
  {
id:3,
group:[
    {value:7},
    {value:8},
    {value:1},
  ]
},
{
id:4,
group:[
    {value:2},
    {value:3},
    {value:4},
  ]
},
{
id:6,
group:[
    {value:5},
    {value:1},
    {value:2},
  ]
},
{
id:12,
group:[
    {value:3},
    {value:4},
    {value:5},
  ]
},
{
id:1,
group:[
    {value:a},
    {value:b},
    {value:c},
  ]
}
{
id:2,
group:[
    {value:4},
    {value:5} 
   ]
}
];

Is there a helpful script for this, or should I stick to using js, and then looping through the resulting object to do the myself?

I'm trying:

var array1 = [
    {id:1, value:1}, 
    {id:1, value:2},
    {id:1, value:3},
    {id:2, value:4},
    {id:2, value:5},
    {id:2, value:6}, 
    {id:3, value:7},
    {id:3, value:8},
    {id:3, value:1},
    {id:4, value:2},
    {id:4, value:3},
    {id:4, value:4},
    {id:6, value:5},
    {id:6, value:1},
    {id:6, value:2},
    {id:12, value:3},
    {id:12, value:4},
    {id:12, value:5},
    {id:1, value:"a"},
    {id:1, value:"b"},
    {id:1, value:"c"},
    {id:2, value:4},
    {id:2, value:5},
];


var FinalArray=[];
for(i=0;i<array1.length;i++)
{ 
    var newArray={id:array1[i].id,group:{value:[]}};
    var group={value:[]};
    newArray.group=group;

    if(newArray.id == array1[i].id){
        for(j=i;j<array1.length;j++)
        {
            if(array1[i].id==array1[j].id)
            {
                group.value.push(array1[j].value);
            }   
        }
    }

    var IsAddeble=true;

    if(FinalArray.length>0)
    {
        for(k=0;k<FinalArray.length;k++)
        {
            if(FinalArray[FinalArray.length-1].id==array1[i].id)
            {
                IsAddeble=false;
            } 
        }    
    }
    if(IsAddeble){  
        FinalArray.push(newArray);
    }
}
console.log(FinalArray);

Any solution how to do that?

2 Answers 2

1

You could check the last item of the result array and insert a new object in group or create a new group object.

var array = [{ id: 1, value: 1 }, { id: 1, value: 2 }, { id: 1, value: 3 }, { id: 2, value: 4 }, { id: 2, value: 5 }, { id: 2, value: 6 }, { id: 3, value: 7 }, { id: 3, value: 8 }, { id: 3, value: 1 }, { id: 4, value: 2 }, { id: 4, value: 3 }, { id: 4, value: 4 }, { id: 6, value: 5 }, { id: 6, value: 1 }, { id: 6, value: 2 }, { id: 12, value: 3 }, { id: 12, value: 4 }, { id: 12, value: 5 }, { id: 1, value: "a" }, { id: 1, value: "b" }, { id: 1, value: "c" }, { id: 2, value: 4 }, { id: 2, value: 5 }],
    result = array.reduce((r, { id, value }) => {
        var last = r[r.length - 1];
        if (last && last.id === id) {
            last.group.push({ value });
        } else {
            r.push({ id, group: [{ value }] });
        }
        return r;
    }, [])

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks for help,but somthing wrong its group type but not correct i want every elment id check if id is same push array object or not id same create new object same as id
i want this type :
1

Using reduce

var array = [
    {id:1, value:1}, 
    {id:1, value:2},
    {id:1, value:3},
    {id:2, value:4},
    {id:2, value:5},
    {id:2, value:6}, 
    {id:3, value:7},
    {id:3, value:8},
    {id:3, value:1},
    {id:4, value:2},
    {id:4, value:3},
    {id:4, value:4},
    {id:6, value:5},
    {id:6, value:1},
    {id:6, value:2},
    {id:12, value:3},
    {id:12, value:4},
    {id:12, value:5},
    {id:1, value:"a"},
    {id:1, value:"b"},
    {id:1, value:"c"},
    {id:2, value:4},
    {id:2, value:5},
];


var match;

var output = array.reduce( function(arr,obj){
	
	match=0;
		
	for(var i=0;i<arr.length;i++)
	{

		if(arr[i].id==obj.id)
		{
			arr[i].group.push({value:obj.value});
			match=1;
		}
	}
	
	if(!match)
	{
	  arr.push({id:obj.id,group:[{value:obj.value}]});
	}

	return arr;
},[]
);

console.log(JSON.stringify(output,null, 2)); // spacing level = 2

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.