如何在 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) {
    ...
}