按值删除数组元素的最佳方法

时间:2011-09-05 16:19:37

标签: javascript arrays

我有一个像这样的数组

arr = ["orange","red","black","white"]

我想扩充定义deleteElem()方法的数组对象,其行为如下:

arr2 = arr.deleteElem("red"); // ["orange","black","white"] (with no hole)

仅使用value参数(无索引)完成此任务的最佳方法是什么?

10 个答案:

答案 0 :(得分:87)

以下是它的完成方式:

var arr = ["orange","red","black","white"];
var index = arr.indexOf("red");
if (index >= 0) {
  arr.splice( index, 1 );
}

此代码将删除数组中出现的“红色”1。

答案 1 :(得分:21)

我知道这个问题已经有了一个可以接受的答案但是当我刚接触编码时,我总是发现splice根本不是直截了当的。即使在今天,它仍然感觉不太可读。

但可读性很重要。

所以在这种情况下,我宁愿使用像这样的过滤方法:

arr = ["orange","red","black","white","red"]

arr = arr.filter(val => val !== "red");

console.log(arr) // ["orange","black","white"]

就是这样。

  

请注意,此方法会删除所有出现的" red"在你的阵列中。

现在我觉得这很有趣,你真的可以很容易地读到发生了什么。 在我的情况下,更有趣的是,如果使用对象数组,您可以轻松地进一步,例如:

arr = arr.filter(obj => obj.prop !== "red");

根据ryannjohnson的评论,这种方法似乎没有任何警告。

答案 2 :(得分:4)

有一个下划线方法,http://underscorejs.org/#without

arr = ["orange","red","black","white"];

arr = _.without(arr, "red");

答案 3 :(得分:1)

我的方法,让我们看看别人有什么话要说。它也支持“等于”方法。

 // Remove array value
 // @param {Object} val
 Array.prototype.removeByValue = function (val) {
    for (var i = 0; i < this.length; i++) {
       var c = this[i];
       if (c == val || (val.equals && val.equals(c))) {
          this.splice(i, 1);
          break;
       }
    }
 };

在使用带有Array的原型时,阅读https://stackoverflow.com/a/3010848/356726了解对迭代的影响。

答案 4 :(得分:1)

Array.prototype.deleteElem = function(val) {
    var index = this.indexOf(val); 
    if (index >= 0) this.splice(index, 1);
    return this;
}; 
var arr = ["orange","red","black","white"];
var arr2 = arr.deleteElem("red");

答案 5 :(得分:1)

或者只是检查所有项目,创建一个不相等的新数组并返回它。

var arr = ['orange', 'red', 'black', 'white'];

console.info('before: ' + JSON.stringify(arr));

var deleteElem = function ( val ) {
    var new_arr = [];
    for ( var i = 0; i < this.length; i++ ) {
        if ( this[i] !== val ) {
            new_arr.push(this[i]);
        }
    }
    return new_arr;
};

arr = deleteElem('red');

console.info('after: ' + JSON.stringify(arr));

http://jsfiddle.net/jthavn3m/

答案 6 :(得分:1)

诀窍是从头到尾遍历数组,这样你就不会在删除元素时弄乱指数。

var deleteMe = function( arr, me ){
   var i = arr.length;
   while( i-- ) if(arr[i] === me ) arr.splice(i,1);
}

var arr = ["orange","red","black", "orange", "white" , "orange" ];

deleteMe( arr , "orange");

arr现在是[&#34;红色&#34;,&#34;黑色&#34;,&#34;白色&#34;]

答案 7 :(得分:0)

最好的方法是使用拼接和重建新数组,因为在拼接之后,数组的长度不会改变。

看看我的回答:

function remove_array_value(array, value) {
    var index = array.indexOf(value);
    if (index >= 0) {
        array.splice(index, 1);
        reindex_array(array);
    }
}
function reindex_array(array) {
   var result = [];
    for (var key in array) {
        result.push(array[key]);
    }
    return result;
}

示例:

var example_arr = ['apple', 'banana', 'lemon'];   // length = 3
remove_array_value(example_arr, 'banana');

banana被删除,数组长度= 2

答案 8 :(得分:0)

如果订购数组(更改位置)不会出现问题,您可以解决:

var arr = ["orange","red","black","white"];
arr.remove = function ( item ) {
  delete arr[item];
  arr.sort();
  arr.pop();
  console.log(arr);
}

arr.remove('red');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

答案 9 :(得分:-2)

你走了:

arr.deleteElem = function ( val ) {
    for ( var i = 0; i < this.length; i++ ) {
        if ( this[i] === val ) {
            this.splice( i, 1 );
            return i;
        }
    }
};

现场演示: http://jsfiddle.net/4vaE2/3/

deleteElem方法返回已删除元素的索引。

var idx = arr.deleteElem( 'red' ); // idx is 1