【发布时间】: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