使用.filter()过滤javascript对象

时间:2018-10-08 06:27:47

标签: javascript arrays filter

有人对使用.filter()函数过滤这种javascript对象有想法吗?

让我说:

docs: [
{
  "name": "Mike",
  "address": "Canada",
  "gender": "Male"
},
{
  "name": "Jean",
  "address": "China",
  "gender": "Female"
},
{
  "name": "Sakura",
  "address": "England",
  "gender": "Female"
}
]

是否可以像这样过滤:

name = ''
age = ''
gender = 'Female'

因为这样做是这样的:

filtered_docs = docs.filter(function (el) {
   return el.name == '' ||
      el.address == '' ||
      el.gender == 'Female';
});

将全部退回。

并这样做:

filtered_docs = docs.filter(function (el) {
   return el.name == '' &&
      el.address == '' &&
      el.gender == 'Female';
});

将不返回任何内容。

更新: 我只想根据该条件返回数据。 我希望返回2条女性记录

更新 这就是我想要实现的 enter image description here

3 个答案:

答案 0 :(得分:1)

您可以将objetc用于键/值对以进行过滤,并且第一步仅使用具有所需值的键,例如truthy值以进行后续过滤。

然后通过仅检查具有要检查的值的键来过滤数组,并采用过滤器的这些键进行检查。仅返回与所有键和所需值匹配的对象。

var docs= [{ name: "Mike", address: "Canada", gender: "Male" }, { name: "Jean", address: "China", gender: "Female" }, { name: "Sakura", address: "England", gender: "Female" }],
    filter = { name: "", age: "", gender: "Female" },
    keys = Object.keys(filter).filter(k => filter[k]),
    result = docs.filter(o => keys.every(k => o[k] === filter[k]));
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

您是否要过滤(即搜索数组并找到匹配的对象),还是要创建一个性别为女性,其余为空字符串的新数组?

如果要过滤,则第二种方法将起作用。它不会返回任何内容,因为docs数组中的所有对象均不符合条件。

如果要创建一个新数组,请考虑使用.map()。参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

答案 2 :(得分:0)

您的条件有误,您只需要输入性别条件即可过滤

    filtered_docs = docs.filter(function (el) {return el.gender == 'Female';});