繁体   English   中英

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

[英]Compare all values of an Array of Objects with an Object

我有以下数据:

 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条目正在改变(无关紧要)我试图创建一个过滤结果的函数,并且只返回满足locationcompany标准的对象。

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

{ 
  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个属性集合,那么你需要做一些变化,你可以Array#every方法中使用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]))) ) 

使用Array.prototype.filterArray.prototype.everyObject.keys来获得所需的结果:(请注意, obj可以有任意数量的键,这样灵活)

 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"] } function find(arr, obj) { // get only the keys from obj that their corresponding array is not empty var keys = Object.keys(obj).filter(k => obj[k].length !== 0); // return a filtered array of objects that ... return arr.filter(o => { // ... met the creteria (for every key k in obj, the current object o must have its value of the key k includded in the array obj[k]) return keys.every(k => { return obj[k].indexOf(o[k]) != -1; }); }); } console.log(find(myArr, myObj)); 

您可以通过迭代条件的键进行过滤,并检查内容是否相等,如果数组的长度不为零。

 const filterBy = (array, criteria) => array.filter(o => Object.keys(criteria).every(k => criteria[k].some(c => c === o[k]) || !criteria[k].length) ); const myArr = [{ id: 0, company: "microsoft", location: "berlin" }, { id: 1, company: "google", location: "london" }, { id: 2, company: "twitter", location: "berlin" }]; console.log(filterBy(myArr, { company: ["google", "twitter"], location: ["london"] })); console.log(filterBy(myArr, { company: ["google", "twitter"], location: [] })); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

使用Array#includes而不是Array#some

 const filterBy = (array, criteria) => array.filter(o => Object.keys(criteria).every(k => criteria[k].includes(o[k]) || !criteria[k].length) ); const myArr = [{ id: 0, company: "microsoft", location: "berlin" }, { id: 1, company: "google", location: "london" }, { id: 2, company: "twitter", location: "berlin" }]; console.log(filterBy(myArr, { company: ["google", "twitter"], location: ["london"] })); console.log(filterBy(myArr, { company: ["google", "twitter"], location: [] })); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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