如何在 JSON 数组中使用 IndexOf?它返回-1
How to use IndexOf in a JSON array? It's returning -1
假设我正在这个 JSON 数组中搜索汽车型号 "Focus"
我想 return 它在数组中的位置。
我认为 indexOf
是 return-1 的结果,因为我没有停止循环。我是初学者。
我想要 return 它的位置的原因是我可以 return 其他与 "Focus" 相关的结果,例如 "Ford" 通过简单地知道它在数组中的位置.
var myObj, i, j, x = "";
myObj = {
"name":"John",
"age":30,
"cars": [
{ "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
{ "name":"BMW", "models":[ "320", "X3", "X5" ] },
{ "name":"Fiat", "models":[ "500", "Panda" ] }
]
}
for (i = 0; i < myObj.cars.length; i++) {
for (j in myObj.cars[i].models) {
x = myObj.cars[i].models[j];
a = x.indexOf("Focus");
document.getElementById("demo").innerHTML = a;
}
}
<p id="demo"></p>
首先,我将使用 JSON.parse 方法解析 json。
注意:我在这里使用 ECMAScript 6 (ES6) 功能来使用多行字符串。旧版浏览器不支持此功能。
然后我会利用 Array Prototype 函数,如 map()
和 find()
首先将所有具有 'Focus' 的模型的索引映射到一个新数组,然后取第一个其中索引为 0 或更高。 indexOf()
Returns -1 当您查找的元素不存在时。
var json = `{
"name": "John",
"age": 30,
"cars": [
{ "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
{ "name":"BMW", "models":[ "320", "X3", "X5" ] },
{ "name":"Fiat", "models":[ "500", "Panda" ] }
]
}`
var myObj = JSON.parse(json)
var focusIndex = myObj.cars.map(c => c.models.indexOf('Focus')).find(i => i >= 0)
document.getElementById("demo").innerHTML = focusIndex
<p id="demo"></p>
与其处理两个不同的 for 循环,不如使用一个并尝试获取每次迭代的索引。测试 x
的值是否为 -1(表示未找到)。如果不是-1,则表示已找到,x
是索引。
for (i = 0; i < myObj.cars.length; i++) {
x = myObj.cars[i].models.indexOf("Focus");
if (-1 != x) {
document.getElementById("demo").innerHTML = x;
break;
}
}
break
打破了 for 循环,因此在发生冲突的情况下,您将只获得第一个有效索引。
编辑
作为旁注,我想我会提到您真正的问题是什么:您的 indexOf()
调用正在返回一个值,但您没有检查它的 -1
值。在您的原始代码中,如果您测试 a != -1
它只会确认 a == "Focus"
而不会为您提供有关其索引的任何详细信息。最后,对于最小的编辑,您需要做
if (-1 != a) {
document.getElementById("demo").innerHTML = j;
}
相当于
if ("Focus" == x) {
...
}
假设我正在这个 JSON 数组中搜索汽车型号 "Focus" 我想 return 它在数组中的位置。
我认为 indexOf
是 return-1 的结果,因为我没有停止循环。我是初学者。
我想要 return 它的位置的原因是我可以 return 其他与 "Focus" 相关的结果,例如 "Ford" 通过简单地知道它在数组中的位置.
var myObj, i, j, x = "";
myObj = {
"name":"John",
"age":30,
"cars": [
{ "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
{ "name":"BMW", "models":[ "320", "X3", "X5" ] },
{ "name":"Fiat", "models":[ "500", "Panda" ] }
]
}
for (i = 0; i < myObj.cars.length; i++) {
for (j in myObj.cars[i].models) {
x = myObj.cars[i].models[j];
a = x.indexOf("Focus");
document.getElementById("demo").innerHTML = a;
}
}
<p id="demo"></p>
首先,我将使用 JSON.parse 方法解析 json。
注意:我在这里使用 ECMAScript 6 (ES6) 功能来使用多行字符串。旧版浏览器不支持此功能。
然后我会利用 Array Prototype 函数,如 map()
和 find()
首先将所有具有 'Focus' 的模型的索引映射到一个新数组,然后取第一个其中索引为 0 或更高。 indexOf()
Returns -1 当您查找的元素不存在时。
var json = `{
"name": "John",
"age": 30,
"cars": [
{ "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
{ "name":"BMW", "models":[ "320", "X3", "X5" ] },
{ "name":"Fiat", "models":[ "500", "Panda" ] }
]
}`
var myObj = JSON.parse(json)
var focusIndex = myObj.cars.map(c => c.models.indexOf('Focus')).find(i => i >= 0)
document.getElementById("demo").innerHTML = focusIndex
<p id="demo"></p>
与其处理两个不同的 for 循环,不如使用一个并尝试获取每次迭代的索引。测试 x
的值是否为 -1(表示未找到)。如果不是-1,则表示已找到,x
是索引。
for (i = 0; i < myObj.cars.length; i++) {
x = myObj.cars[i].models.indexOf("Focus");
if (-1 != x) {
document.getElementById("demo").innerHTML = x;
break;
}
}
break
打破了 for 循环,因此在发生冲突的情况下,您将只获得第一个有效索引。
编辑
作为旁注,我想我会提到您真正的问题是什么:您的 indexOf()
调用正在返回一个值,但您没有检查它的 -1
值。在您的原始代码中,如果您测试 a != -1
它只会确认 a == "Focus"
而不会为您提供有关其索引的任何详细信息。最后,对于最小的编辑,您需要做
if (-1 != a) {
document.getElementById("demo").innerHTML = j;
}
相当于
if ("Focus" == x) {
...
}