【问题标题】:Filter an Object based on values in array根据数组中的值过滤对象
【发布时间】:2019-05-03 11:05:01
【问题描述】:

我在互联网上遇到了一个小问题,我无法弄清楚或找到解决方案,至少我知道。我想根据数组中未定义数量的值过滤 javascript 中的对象。我有一个这样的对象:

categories = { "category1: {"_id": "1234"}, "category2: {"_id": "4567"}, ... };

我还有一个包含 ID 值的数组,如下所示:

catArray = ["1234", "4567", ... ]

现在我想从类别对象中过滤掉所有类别,匹配数组中的 ID。我设法过滤了单个数组值的类别,但不是全部。它的工作原理是这样的:

const categoriesFilter = categories.filter(cat => {
        return cat._id == catArray[0];
});

到目前为止,它正在工作。但现在我想匹配数组中所有可能的 ID 值的类别。我试图用for循环来做,但没有成功。任何想法?提前非常感谢。

【问题讨论】:

  • 不应该工作,因为你说categories是一个普通的对象。那些没有filtercategories 真的是一个数组吗?
  • 它不应该以另一种方式工作:_id 与具有id 的数据也不匹配。
  • 也许我切换了类别。我从其他一些代码中得到它并且它正在工作,我只是将该对象放在上面作为示例。而且身份证是错的。它应该是“_id”

标签: javascript arrays object filter ecmascript-6


【解决方案1】:

例如,类别应该是一个对象数组。然后你可以使用.filter():

let categories = [{ "id": "1234" }, { "id": "4567" }];
let catArray = ["1234", "45674"];

const categoriesFilter = categories.filter(cat => {
  return catArray.includes(cat.id);
});

console.log(categoriesFilter);

【讨论】:

  • 这不是一个有效的数组。
  • 不是,你应该用其他元素填充 ...。
  • 没有。您仍然有对象键。以category1 为例。
  • 你是对的。抱歉,没注意。编辑了答案。
  • 刚刚在您的答案中添加了一个 sn-p。
【解决方案2】:

您可以先创建一个以id 为键的对象,然后将其用作查找表来创建具有按数组过滤的属性的新对象。

const cat = { category1: {"id": "1234"}, category2: {"id": "4567"}, category3: {"id": "123"}};
const arr = ["1234", "4567" ]
const hash = Object.entries(cat)
  .reduce((r, [k, v]) => Object.assign(r, {[v.id]: {[k]: v}}), {})

const result = arr.reduce((r, id) => {
  if(hash[id]) Object.assign(r, hash[id])
  return r;
}, {})

console.log(result)

【讨论】:

    【解决方案3】:

    你可以这样做:

    var categories = { "category1": {"id": "1234"}, "category2": {"id": "4567"}, "category4": {"id": "45678"}}; var catArray = ["1234", "4567"]; var categoriesFilter = Object.entries(categories).filter(([catKey,catValue]) => { return catArray.includes(catValue.id); });

    【讨论】:

    • 成功了一半。我现在可以遍历数组中的 ID。但是类别对象中的所有其他键和值都丢失了。
    【解决方案4】:
    const categories = { category1: {"id": "1234"}, category2: {"id": "4567"}, category3: {"id": "123"}};
    const catArray = ["1234", "4567" ]
    const checkIfArrIncludes = (id) => catArray.includes(id);
    const matchedCats = Object.values(categories).filter(cat => (checkIfArrIncludes(cat.id) ? cat : 0));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 2020-12-03
      • 2020-01-12
      • 2017-03-19
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      相关资源
      最近更新 更多