无法在复杂数组上使用indexOf

Nic*_*ick 9 javascript arrays indexof

可能重复:
对象数组中的indexOf方法?

我有一个遵循这种格式的javascript数组:

var arrayName = [
{id: "a", gender: "man",   item: "stuff"},
{id: "b", gender: "woman", item: "stuff"},
{id: "c", gender: "man",   item: "stuff"},
{id: "d", gender: "man",   item: "stuff"}
];
Run Code Online (Sandbox Code Playgroud)

有没有办法可以使用array.indexOf在数组中查找索引,例如我知道"id"变量.

比如我试过;

var position = arrayName.indexOf("b");
arrayName[position].gender = "man"
Run Code Online (Sandbox Code Playgroud)

我正在使用的那一刻;

for(var i=0; i<arrayName.length; i++) {
   if(arrayName[i].id == "b"){
       arrayName[i].gender = "man";
   }
}
Run Code Online (Sandbox Code Playgroud)

第二种技术有效,但我使用的实际数组在每个条目中有150个条目和10个项目,因此当我知道要编辑的条目的"id"时,循环遍历它似乎非常浪费.如果我可以使它工作,indexOf将是一个更清洁的方法.

Ada*_*kis 19

您的调用indexOf是检查数组中的对象与字符串b,这将永远不会工作.

循环遍历数组元素以找到正确的id是一个简单的解决方案.

或者,您可以创建自己的indexOf函数:

Array.prototype.indexOfId = function(id) {
    for (var i = 0; i < this.length; i++)
        if (this[i].id === id)
            return i;
    return -1;
}

    var arrayName = [
      { id: "a", gender: "man", item: "stuff" },
      { id: "b", gender: "woman", item: "stuff" },
      { id: "c", gender: "man", item: "stuff" },
      { id: "d", gender: "man", item: "stuff" }];

    var position = arrayName.indexOfId("b");

    alert(position);  //alerts 1
Run Code Online (Sandbox Code Playgroud)

这是一个小提琴

编辑

如果要将数组元素与任何属性进行比较,请按照以下方法进行操作(请注意,我使用[]语法来获取任意属性)

    Array.prototype.indexOfField = function (propertyName, value) {
        for (var i = 0; i < this.length; i++)
            if (this[i][propertyName] === value)
                return i;
        return -1;
    }

    var position = arrayName.indexOfField("id", "b");
    alert(position);  //alerts 1

    position = arrayName.indexOfField("gender", "man");
    alert(position); //alerts 0
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想使用Array的原型,并且不介意使用旧浏览器中不存在的filter功能,则可以使用Array的功能

var position = arrayName.indexOf(arrayName.filter(function (val) {
      return val.id === "b";
})[0]);
Run Code Online (Sandbox Code Playgroud)

请注意,IE8中不存在此功能,因此要支持此浏览器,您必须从MDN获取填充程序

编辑 - oops,indexOf对旧浏览器也不友好.如果您选择第二位代码并希望支持IE,那么您还必须从这里获取indexOf的垫片