javascript - 筛选对象数组并返回满足所有给定条件的对象

标签 javascript arrays object conditional-statements filtering

所以,我有这个名为“字符”的对象数组(目前只有 3 个对象,但应该更多),我想用一个函数(或数组方法)过滤这个数组,例如:返回每个 Angular 色的名字,谁是 character.bodyType: "tall" 或者有 character.element: "fire" 并且也是 character.weapon: "sword" 用户,基于我传递给函数的参数值的数量。

我编写了一个函数“isThere”,它最多接受 4 个参数,但我希望能够使用小于 4 的任意数量的值来调用它,并仅根据这些参数值获取名称。假设我只想显示高大男性 Angular 色的名字。结果应该是 ['Igneus'] 但我得到的是 [ 'Renna', 'Igneus', 'Igneus', 'Dagon' ] 我不知道找出它的逻辑,只过滤满足两个要求并跳过重复项的那些以及只满足其中一个要求的那些。 如果我只想查看“剑”字符的名称,结果应该是 ["Renna", "Igneus]... 等等。

我的代码显然是未完成和错误的,我尝试了几种不同的 if 语句方法,这就是我停止的地方。如果可以用数组方法来做,那又短又干净,我会接受的。我尝试了 Array.filter() 方法,但我只是不知道如何在其中实现一个 4 参数函数,或者它是否可能。

const characters = [
  {
    bodyType: "tall",
    element: "air",
    gender: "female",
    name: "Renna",
    weapon: "sword",
  },
  {
    bodyType: "tall",
    element: "fire",
    gender: "male",
    name: "Igneus",
    weapon: "sword",
  },
  {
    bodyType: "medium",
    element: "water",
    gender: "male",
    name: "Dagon",
    weapon: "spear",
  },
];


  function isThere(body, element, gender, weapon) {
    const arr = [];
    for (const char of characters) {
        if (char.bodyType === body) {
          arr.push(char.name)
        }
        if(char.element === element){
          arr.push(char.name)
        }
        if(char.gender === gender){
          arr.push(char.name)
        }
        if(char.weapon === weapon){
          arr.push(char.name)
        }
    }
    return arr;
  }


isThere("tall", undefined, "male", undefined)

最佳答案

目前,您的代码充当一个巨大的“或”——如果满足任何条件,它就会推送名称。您实际上是在寻找“和”。此外,如果未指定条件,字符应立即通过条件,这就是为什么我添加了 (typeof ... !== "undefined"? ... : ...).

const characters = [{
    bodyType: "tall",
    element: "air",
    gender: "female",
    name: "Renna",
    weapon: "sword",
  },
  {
    bodyType: "tall",
    element: "fire",
    gender: "male",
    name: "Igneus",
    weapon: "sword",
  },
  {
    bodyType: "medium",
    element: "water",
    gender: "male",
    name: "Dagon",
    weapon: "spear",
  },
];


function isThere(body, element, gender, weapon) {
  const arr = [];
  for (const char of characters) {
    if ((typeof body === "undefined" ? true : char.bodyType === body) &&
        (typeof element === "undefined" ? true : char.element === element) &&
        (typeof gender === "undefined" ? true : char.gender === gender) && 
        (typeof weapon === "undefined" ? true : char.weapon === weapon)) {
      arr.push(char.name)
    }
  }
  return arr;
}


console.log(isThere("tall", undefined, "male", undefined));

关于javascript - 筛选对象数组并返回满足所有给定条件的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74283108/

相关文章:

arrays - Kotlin - Val 无法重新分配,但可以通过从索引访问来重新分配?

JavaScript/Lodash/Angular 1 - 在对象数组中搜索并找到属性

javascript - 对象数组上的 Array.reduce() ——返回单个字母的字符串

Java 方法 boolean 值在应该为 true 时返回 false

javascript - 从对象映射中获取键名称

javascript - 使用 JS 设置 SVG 元素的属性不起作用

javascript - 将可拖动点绑定(bind)在一起

arrays - 有没有一种简单的方法可以在 Fsharp 中将 byte [] 转换为 ReadOnlySpan<byte> ?

javascript - 如何在没有任何 JQuery Lib 的情况下知道实际的客户端高度?

javascript - 单击加号时如何将两个数值相加