无法在复杂数组上使用indexOf

时间:2011-12-29 16:21:59

标签: javascript arrays indexof

  

可能重复:
  indexOf method in an object array?

我有一个遵循以下格式的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"}
];

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

例如我试过;

var position = arrayName.indexOf("b");
arrayName[position].gender = "man"

我正在使用的那一刻;

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

这第二种技术有效,但我使用的实际数组在每个条目中有150个条目和10个项目,因此当我知道要编辑的条目的“id”时,循环遍历它似乎非常浪费。如果我能让它工作的话,indexOf将会更加清晰。

3 个答案:

答案 0 :(得分: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

这是fiddle

修改

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

    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

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

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

请注意,IE8中不存在此功能,因此要支持此浏览器,您必须抓住shim from MDN

编辑 - oops,indexOf对旧浏览器也不友好。如果您选择第二段代码并希望支持IE,那么您还必须抓住indexOf from here

的垫片

答案 1 :(得分:1)

如果有机会,可以使用Array.prototype.filter:

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"}
];

console.log(arrayName.filter(function(i) {
    return i.id === 'b';
}));

这将给出:

[ { id: 'b', gender: 'woman', item: 'stuff' } ]

答案 2 :(得分:0)

您可以使用indexOf

覆盖prototype
Array.prototype.indexOf = function(elem) {
    for (var i = 0; i < this.length; i++){
        if (this[i].id === elem)
            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"}
];

alert(arrayName.indexOf("b"));

小提琴:http://jsfiddle.net/r8rp9/1/