0

私は Array[] を持っていますthis.unusedInstruments:

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

および関数: (渡されるパラメーターは、「1」、「2」、または「3」であると検証されます

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

しかし、私は期待したものを得ていません。をログに記録しましたが、パラメーターにもかかわらずindex常に返されます。-1インデックスが存在しないと言っていると思いますが、それは、インデックス付きオブジェクトの親配列を照会する方法がわからないことを意味すると思います。

4

2 に答える 2

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 に答える
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 に答える