![](/img/trans.png)
[英]How to conditionally apply a filter to a Firestore query with JavaScript
[英]How to conditionally filter the data
我正在编写一个小的 js 代码,我需要在其中根据传递的密钥过滤数据。 这里,主要问题是,数据不一致(请参考我的代码示例)。
var users = [{ name: 'paul', job: 'engineer' }, { name: 'John', job: 'Mechanic' }, { name: 'paul', job: 'Mechanic' }, { name: 'George', job: 'Plumber' }, { name: 'John' }, ]; filtersToApply = { job: 'engineer' }; returnFilteredList = (users, columnDataToFilter) => { return users.filter((row) => { return Object.keys(columnDataToFilter).every( (propertyName) => row[propertyName].toString().toLowerCase().indexOf(columnDataToFilter[propertyName].toString().toLowerCase()) > -1 ); }); }; console.log(JSON.stringify(returnFilteredList(users, filtersToApply)));
在这里我得到错误,'因为,数组中最后一个 JSON object 没有job
。 我该如何处理?
您可以获得过滤条件的条目,并根据需要使用Array#every
或Array#some
检查。
const users = [{ name: 'paul', job: 'engineer' }, { name: 'John', job: 'Mechanic' }, { name: 'paul', job: 'Mechanic' }, { name: 'George', job: 'Plumber' }, { name: 'John' }], filtersToApply = { job: 'engineer' }, filters = Object.entries(filtersToApply), result = users.filter(user => filters.every(([k, v]) => (user[k] || '').toLowerCase() === v) ); console.log(result);
如果你有一个数组或只有一个字符串,你需要比较每个值并提前调整大小写。
const users = [{ name: 'paul', job: 'engineer' }, { name: 'John', job: ['Mechanic', 'Engineer'] }, { name: 'paul', job: 'Mechanic' }, { name: 'George', job: 'Plumber' }, { name: 'John' }], filtersToApply = { job: 'engineer' }, filters = Object.entries(filtersToApply), result = users.filter(user => filters.every(([k, v]) => [].concat(user[k] || []).map(s => s.toLowerCase()).includes(v) ) ); console.log(result);
.as-console-wrapper { max-height: 100%;important: top; 0; }
有时row[propertyName]
是未定义的。 您可以使用Optional Chaining 运算符来避免错误:
return Object.keys(columnDataToFilter).every(
(propertyName) =>
row[propertyName]? //<--
.toString()
.toLowerCase()
.indexOf(columnDataToFilter[propertyName].toString().toLowerCase()) >
-1
);
return Object.keys(columnDataToFilter).every(
(propertyName) =>
row[propertyName]|| '' //you can add undefined keys to empty string.
.toString()
.toLowerCase()
.indexOf(columnDataToFilter[propertyName].toString().toLowerCase()) >
-1
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.