简体   繁体   中英

Filter object list using ids in an array in Jquery

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM