JS .indexOf('string')返回-1

时间:2013-07-02 01:07:04

标签: javascript

我有一个数组[] this.unusedInstruments

[
    { label: 'one'},
    { label: 'two'},
    { label: 'three'}
]

和一个函数:(传入的参数被验证为'one','two'或'three'

removeInstrument: function(removedIntrument) {
  var index = this.unusedInstruments.indexOf(removedIntrument);
  delete this.unusedInstruments[index];
},

但我没有达到我的预期。我记录了index,尽管有参数,它仍然会返回-1。我假设它说索引不存在,但我想这意味着我不知道如何查询索引对象的父数组。

2 个答案:

答案 0 :(得分:1)

.indexOf()仅在字符串是您正在搜索的数组的元素时才有效。但是在您的数据中,字符串是元素的label属性的值,它不是元素本身。您需要编写一个循环来钻取对象并与属性进行比较。

removeInstrument: function(removedInstrument) {
    for (i = 0; i < this.unusedInstruments.length; i++) {
        if (this.unusedInstruments[i].label == removedInstrument) {
            delete this.unusedInstruments[i];
            break;
        }
    }
}

答案 1 :(得分:1)

只要它是一个数组 - 你不能只是delete它的元素,否则你会得到一个undefined值的洞。所以你需要更聪明的方法:

removeInstrument: function(removedInstrument) {
    var len = this.unusedInstruments.length,
        i;

    var remove = function(arr, from) {
        // Based on John Resig's article (MIT Licensed)
        // http://ejohn.org/blog/javascript-array-remove/

        var rest = arr.slice(from + 1);
        arr.length = from;
        return arr.push.apply(arr, rest);
    };

    for (i = 0; i < len ; ++i) {
        if (this.unusedInstruments[i].label == removedInstrument) {
            remove(this.unusedInstruments, i);
            break;
        }
    }
}

remove()函数实现构思借鉴https://stackoverflow.com/a/9815010/251311