首页 > 解决方案 > 在 Jquery 中使用数组中的 id 过滤对象列表

问题描述

我有一个对象列表,每个对象都有一个特定的代码。还有另一个包含这些特定代码的数组,我想检索与数组中的代码匹配的所有对象。我尝试使用 grep 函数和 indexOf 方法,但没有收到任何结果。有人可以帮我弄这个吗?

    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",
    }
];

根据上面的对象列表和数组,我只需要将Name2、Name4、Name5对象放入不同的列表中。您可以在下面找到我为此使用的代码。但我没有运气

var selectedObjects = $.grep(objArray, function (e) {
    return selectedCodes.indexOf(e.ItemCode) > -1;
});

标签: javascriptjquery

解决方案


对于一个O(n)解决方案,首先构造一个其键是代码的对象,然后.mapselectedCodes

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);

不需要像 jQuery 这样的大型库来实现这么简单的事情。


推荐阅读