javascript - 将对象数组的所有值与对象进行比较

标签 javascript arrays object lodash

我有以下数据:

const myArr = [{
  id: 0,
  company: "microsoft",
  location: "berlin"
}, {
  id: 1,
  company: "google",
  location: "london"
}, {
  id: 2,
  company: "twitter",
  location: "berlin"
}];

let myObj = {
  company: ["google", "twitter"],
  location: ["london"]
}

鉴于 myObj.company 条目正在发生变化(与如何变化无关),我正在尝试创建一个函数来过滤结果并仅返回满足 location公司 标准。

在上面的例子中,我们需要返回的是:

{ 
  id: 1,
  company: "google",
  location: "london"
}

如果 myObj

let myObj = {
  company: ["google", "twitter"],
  location: []
}

那么返回的结果应该是

{ 
  id: 1,
  company: "google",
  location: "london"
},
{ 
  id: 2,
  company: "twitter",
  location: "berlin"
}

最佳答案

使用Array#filter使用 Array#includes 的方法方法(旧浏览器支持使用Array#indexOf方法)

myArr.filter(o => (myObj.company.length == 0 || myObj.company.includes(o.company)) && (myObj.location.length == 0 || myObj.location.includes(o.location)))

const myArr = [{
  id: 0,
  company: "microsoft",
  location: "berlin"
}, {
  id: 1,
  company: "google",
  location: "london"
}, {
  id: 2,
  company: "twitter",
  location: "berlin"
}];

let myObj = {
  company: ["google", "twitter"],
  location: ["london"]
}

console.log(
  myArr.filter(o => (myObj.company.length == 0 || myObj.company.includes(o.company)) && (myObj.location.length == 0 || myObj.location.includes(o.location)))
)

myObj = {
  company: ["google", "twitter"],
  location: []
}

console.log(
  myArr.filter(o => (myObj.company.length == 0 || myObj.company.includes(o.company)) && (myObj.location.length == 0 || myObj.location.includes(o.location)))
)


更新:如果有 n 个属性集合,那么您需要做一些变化,您可以在其中使用 Object.keysArray#every方法。

var keys = Object.keys(myObj);

myArr.filter(o => keys.every(k => myObj[k].length == 0 || myObj[k].includes(o[k])))

const myArr = [{
  id: 0,
  company: "microsoft",
  location: "berlin"
}, {
  id: 1,
  company: "google",
  location: "london"
}, {
  id: 2,
  company: "twitter",
  location: "berlin"
}];

let myObj = {
  company: ["google", "twitter"],
  location: ["london"]
}

var keys = Object.keys(myObj);
console.log(
  myArr.filter(o => keys.every(k => myObj[k].length == 0 || myObj[k].includes(o[k])))
)

myObj = {
  company: ["google", "twitter"],
  location: []
}
keys = Object.keys(myObj);
console.log(
  myArr.filter(o => keys.every(k => myObj[k].length == 0 || myObj[k].includes(o[k])))
)

关于javascript - 将对象数组的所有值与对象进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42164688/

相关文章:

javascript - 是否可以使用 Google Optimize 读取 Javascript 中的 ExperimentId 和 VariationId?

c - scanf 加载 struct -> char[] 的问题

php - 是否可以在 PHP 中删除对象的属性?

javascript - 如何按顺序合并两个数组?

javascript - 对嵌套的对象数组进行分组

java - 我的空指针异常

javascript - 简单路径过渡

javascript - 如何创建一条动画线抛出链接中的文本?

javascript - RegExp.test (JavaScript) 错误

c++ - 如何初始化数组 vector