根据数组中的值过滤对象

时间:2018-12-01 14:53:48

标签: javascript arrays object filter ecmascript-6

我遇到了一个小问题,至少在我所知的范围内,我找不到或找到解决方案。我想基于数组中未定义数量的值来过滤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循环来执行此操作,但没有成功。任何想法?非常感谢。

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您可以首先使用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)

答案 2 :(得分:0)

您可以这样做:

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

答案 3 :(得分:0)

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