【问题标题】:Filter array of objects with another objects as parameters使用另一个对象作为参数过滤对象数组
【发布时间】:2018-04-20 23:19:36
【问题描述】:

我想过滤每个国家/地区的 JSON 数据属性名称,以便在网站上进行“搜索”

let array = {
    continents: [
    {
      name: "Europe",
      countries: [
        {
          name: "Austria",
          adresses: {
            1: "one",
            2: "two",
            3: "three"
          }
        },
        {
          name: "Germany",
          adresses: {
            1: "one",
            2: "two",
            3: "three"
          }
        }
      ]
    },
    {
      name: "Asia",
      countries: [
        {
          name: "Thailand",
          adresses: {
            1: "one",
            2: "two",
            3: "three"
          }
        },
        {
          name: "Japan",
          adresses: {
            1: "one",
            2: "two",
            3: "three"
          }
        }
      ]
    }
  ]
};

预期的行为是当我输入“an”时结果将是这样的数组:

let array = {
    continents: [
    {
      name: "Europe",
      countries: [
        {
          name: "Germany",
          adresses: {
            1: "one",
            2: "two",
            3: "three"
          }
        }
      ]
    },
    {
      name: "Asia",
      countries: [
        {
          name: "Thailand",
          adresses: {
            1: "one",
            2: "two",
            3: "three"
          }
        },
        {
          name: "Japan",
          adresses: {
            1: "one",
            2: "two",
            3: "three"
          }
        }
      ]
    }
  ]
};

这样我们就可以摆脱奥地利

如何做到这一点?我们是否应该使用 fliter 函数(基准表明它很慢,基于:https://jsperf.com/function-loops/11)。我们也可以在大陆名称中搜索

现在我知道如何记录正确的值,但是如何从它们组成一个正确的数组呢?

let array = {
  continents: [
    {
      name: "Europe",
      countries: [
        {
          name: "Austria",
          adresses: {
            1: "one",
            2: "two",
            3: "three"
          }
        },
        {
          name: "Germany",
          adresses: {
            1: "one",
            2: "two",
            3: "three"
          }
        }
      ]
    },
    {
      name: "Asia",
      countries: [
        {
          name: "Thailand",
          adresses: {
            1: "one",
            2: "two",
            3: "three"
          }
        },
        {
          name: "Japan",
          adresses: {
            1: "one",
            2: "two",
            3: "three"
          }
        }
      ]
    }
  ]
};

searchValue = "an";

for (let i = 0; i < array.continents.length; i++) {
  for (let j = 0; j < array.continents[i].countries.length; j++) {
    if (
      array.continents[i].countries[j].name
        .toLowerCase()
        .includes(searchValue.toLowerCase())
    ) {
      console.log(array.continents[i].countries[j].name);
    }
  }
}

【问题讨论】:

  • 如果您需要调试帮助,请向我们展示您迄今为止尝试过的代码。速度很少是一个重要的问题。你可能会先得到有效的东西,然后想办法让它更快。
  • 我们应该使用过滤功能吗(基准测试显示它很慢)请证明
  • JSON 不是变量名的好选择。
  • @CertainPerformance 糟糕的 sn-p 添加
  • 关于基准,除非您拥有包含数万或数十万项的海量列表,否则您不会看到差异。此外,它在 Firefox 中也一样快,但在 Chrome 中慢一些。我仍然不会让它决定您选择的解决方案。仅仅因为它比其他东西“慢”并不意味着它“慢”。

标签: javascript ecmascript-6 filtering


【解决方案1】:

好吧..创建一个空数组并在符合搜索条件时推送国家名称:

const array = {
  continents: [{
      name: "Europe",
      countries: [{
          name: "Austria",
          adresses: {
            1: "one",
            2: "two",
            3: "three"
          }
        },
        {
          name: "Germany",
          adresses: {
            1: "one",
            2: "two",
            3: "three"
          }
        }
      ]
    },
    {
      name: "Asia",
      countries: [{
          name: "Thailand",
          adresses: {
            1: "one",
            2: "two",
            3: "three"
          }
        },
        {
          name: "Japan",
          adresses: {
            1: "one",
            2: "two",
            3: "three"
          }
        }
      ]
    }
  ]
}

const searchValue = "an"
let result = []

array.continents.forEach(e =>
  e.countries.forEach(v =>
    v.name.toLowerCase().includes(searchValue) && result.push(v.name))
)

console.log(result)

【讨论】:

  • 这样我会丢失大洲数组
猜你喜欢
  • 2018-10-03
  • 2021-05-14
  • 2017-10-19
  • 2021-10-16
  • 2019-05-05
  • 2019-07-18
相关资源
最近更新 更多