0

我有一个 Array[] this.unusedInstruments

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

和一个函数:(传入的参数被验证为“一”、“二”或“三”

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

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

4

2 回答 2

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

于 2013-07-02T01:17:40.320 回答
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;
        }
    }
}
于 2013-07-02T01:12:39.030 回答