【问题标题】:Filter multidimensional array that contains a certain value过滤包含某个值的多维数组
【发布时间】:2025-12-01 11:20:07
【问题描述】:

我有一个数组...

var families = [
  {
    family:"Jones",
    kids: [
      {name:"Kelly", gender:'female'},
      {name:"Mike", gender:'male'},
      {name:"Bill", gender:'male'}
    ]
  },{
    family:"Smiths",
    kids: [
      {name:"Roger", gender:'male'}
    ]
  }
]

...我需要按性别过滤和分类家庭。因此,如果我搜索“女性”,我想要一系列家庭中包含女性的家庭。不管家里有没有男的。所以在上面的代码中,如果我搜索女性,只有一个家庭会返回。但如果我按男性搜索,2 个家庭会返回。

我的尝试是这样的:

var filter = 'female';
filteredList = families.filter(function (family) {
  return family.kids.filter(function (kid) {
    return kid.gender.toLowerCase().indexOf(filter) !== -1;
  })
})

我没有正确退回它吗?

【问题讨论】:

  • kids 是否有可能拥有自己的kids?您对递归解决方案感兴趣吗?
  • 感谢您的建议,但对于我的使用,这将是不必要的。欣赏远见!

标签: javascript arrays object filter


【解决方案1】:

您应该像这样使用filtersome

var families=[{family:"Jones",kids:[{name:"Kelly",gender:'female'},{name:"Mike",gender:'male'},{name:"Bill",gender:'male'}]},{family:"Smiths",kids:[{name:"Roger",gender:'male'}]}];
var filter = "female";
const res = families.filter(({ kids }) => kids.some(({ gender }) => gender == filter));
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

ES5 语法:

var families=[{family:"Jones",kids:[{name:"Kelly",gender:'female'},{name:"Mike",gender:'male'},{name:"Bill",gender:'male'}]},{family:"Smiths",kids:[{name:"Roger",gender:'male'}]}];
var filter = "female";
var res = families.filter(function(family) {
  return family.kids.some(function(kid) {
    return kid.gender == filter;
  })
});
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

【讨论】:

  • 没问题@user3612986 - 如果我的回答解决了您的问题,请将其标记为已接受。
【解决方案2】:

除了一个小细节之外,您的代码基本上都在那里:您的内部过滤器向外部过滤器返回一个空数组,该数组始终被评估为真。将.length添加到内部数组中,使空数组为假:

var families = [ { family:"Jones", kids: [ {name:"Kelly", gender:'female'}, {name:"Mike", gender:'male'}, {name:"Bill", gender:'male'} ] },{ family:"Smiths", kids: [ {name:"Roger", gender:'male'} ] } ];

var filter = 'female';
filteredList = families.filter(function (family) {
  return family.kids.filter(function (kid) {
    return kid.gender.toLowerCase().indexOf(filter) !== -1;
  }).length
  //^^^^^^^
});

console.log(filteredList);

【讨论】:

  • 我永远不会想到这一点。感谢您的回答!
【解决方案3】:

您可以使用forEachsomeforEach 将用于遍历数组并使用some 查找kids 中的任何对象是否具有所需的性别。

var families = [{
  family: "Jones",
  kids: [{
      name: "Kelly",
      gender: 'female'
    },
    {
      name: "Mike",
      gender: 'male'
    },
    {
      name: "Bill",
      gender: 'male'
    }
  ]
}, {
  family: "Smiths",
  kids: [{
    name: "Roger",
    gender: 'male'
  }]
}];


let filteredData = function(arr, gender) {
  let filteredFamily = [];
  arr.forEach(function(elem) {
    let ifHasGender = elem.kids.some(function(item) {
      return item.gender === gender
    })
    if (ifHasGender) {
      filteredFamily.push(elem)
    }
  })

  return filteredFamily;
}

console.log(filteredData(families, 'female'))

【讨论】:

  • 感谢您的回答。那行得通!但我希望能绕过 forEach。
  • 很奇怪看到你使用.some,然后使用.forEach而不是.filter编写你自己的过滤器——你甚至调用了变量filtered...