I have an object list and each object has a specific code. There is another array with these specific codes and I want to retrieve all the objects which match codes in the array. I tried with grep function and indexOf method but I don't receive any results. Can someone help me with this?
var selectedCodes = [2, 12, 15];
var objArray = [
{
"ItemID": "1",
"ItemName": "Name1",
"ItemCode": "1",
},
{
"ItemID": "2",
"ItemName": "Name2",
"ItemCode": "2",
},
{
"ItemID": "3",
"ItemName": "Name3",
"ItemCode": "10",
},
{
"ItemID": "4",
"ItemName": "Name4",
"ItemCode": "12",
},
{
"ItemID": "5",
"ItemName": "Name5",
"ItemCode": "15",
},
{
"ItemID": "6",
"ItemName": "Name6",
"ItemCode": "20",
}
];
According to the above object list and array, I need to get Name2, Name4, Name5 objects only into a different list. Below you can find the code I'm using for this. But I have no luck with that
var selectedObjects = $.grep(objArray, function (e) {
return selectedCodes.indexOf(e.ItemCode) > -1;
});
For an O(n)
solution, first construct an object whose keys are the codes, then .map
the selectedCodes
:
const objsByCode = {};
for (const item of objArray) {
objsByCode[item.ItemCode] = item;
}
const result = selectedCodes.map(code => objsByCode[code]);
var selectedCodes = [2, 12, 15]; var objArray = [{ "ItemID": "1", "ItemName": "Name1", "ItemCode": "1", }, { "ItemID": "2", "ItemName": "Name2", "ItemCode": "2", }, { "ItemID": "3", "ItemName": "Name3", "ItemCode": "10", }, { "ItemID": "4", "ItemName": "Name4", "ItemCode": "12", }, { "ItemID": "5", "ItemName": "Name5", "ItemCode": "15", }, { "ItemID": "6", "ItemName": "Name6", "ItemCode": "20", } ]; const objsByCode = {}; for (const item of objArray) { objsByCode[item.ItemCode] = item; } const result = selectedCodes.map(code => objsByCode[code]); console.log(result);
No need for a big library like jQuery to achieve something this trivial.
Here you go with a solution
var selectedCodes = [2, 12, 15]; var objArray = [ { "ItemID": "1", "ItemName": "Name1", "ItemCode": "1", }, { "ItemID": "2", "ItemName": "Name2", "ItemCode": "2", }, { "ItemID": "3", "ItemName": "Name3", "ItemCode": "10", }, { "ItemID": "4", "ItemName": "Name4", "ItemCode": "12", }, { "ItemID": "5", "ItemName": "Name5", "ItemCode": "15", }, { "ItemID": "6", "ItemName": "Name6", "ItemCode": "20", } ]; var filteredData = objArray.filter(function(item) { return ( selectedCodes.indexOf(parseInt(item.ItemCode)) > -1 ); }); console.log(filteredData);
Use filter
to filter out the matching records.
Reference: Filter Documentation
const selectedObjects = objectArray.filter(
obj => selectedCodes.includes(Number(obj.ItemCode))
)
Actually you can achieve it by simple modify:
var selectedObjects = $.grep(objArray, function (e) {
return selectedCodes.indexOf(e.ItemCode - 0) > -1;
});
You are actually comparing String to Number. casting ItemCode to Number will solve it.
you can do with simple for loop logic.,
var selectedCodes = [2, 12, 15]; var objArray = [ { "ItemID": "1", "ItemName": "Name1", "ItemCode": "1", }, { "ItemID": "2", "ItemName": "Name2", "ItemCode": "2", }, { "ItemID": "3", "ItemName": "Name3", "ItemCode": "10", }, { "ItemID": "4", "ItemName": "Name4", "ItemCode": "12", }, { "ItemID": "5", "ItemName": "Name5", "ItemCode": "15", }, { "ItemID": "6", "ItemName": "Name6", "ItemCode": "20", } ]; var selectedArra=[]; for(var i=0;i<selectedCodes.length;i++){ for(var j=0;j<objArray.length;j++){ if(parseInt(objArray[j].ItemCode)==selectedCodes[i]){ selectedArra.push(objArray[j]) } } } console.log(selectedArra)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.