繁体   English   中英

Javascript按值从数组中删除数组元素

[英]Javascript delete array element from array by value

我有一个javascript数组,我想基于该数组的值删除一个元素,这是我的数组,这是我尝试未成功的内容。

array = []
array.push (["Mozilla","Firefox",1.10])
index = array.indexOf(["Mozilla","Firefox",1.10])
array.splice(index, 1)

但这不起作用,有什么想法吗?

您正在尝试比较数组,这些数组是对象并且具有唯一的地址。 您的index变量是-1

在控制台中尝试['Mozilla','Firefox',1.10] === ['Mozilla','Firefox',1.10] ,您会看到两个数组具有相同的值,这并不意味着它们是相同的数组。

您需要的是一种深度相等的比较样式,该样式检查数组中的每个值,以查看两个数组是否相似。

看一下lodash的isEqual函数的想法。

这是一个简单的循环功能:

 function deepIndex(array, comparison) { var i, j; main: for (i = 0; i < array.length; i++) { if (Array.isArray(array[i])) { for (j = 0; j < array[i].length; j++) { if (array[i][j] !== comparison[j]) { continue main; } } return i; } } } var arr = []; arr.push('string', ['Mozilla','Firefox',1.10], 'thing'); var index = deepIndex(arr, ['Mozilla','Firefox',1.10]) console.log(index, arr); arr.splice(index, 1); console.log(arr); 

看看这个:

// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};

此功能由JQUery的创建者完成。 基本上,您采用一件事的索引,然后将其删除

 Array.prototype.remove = function(from, to) { var rest = this.slice((to || from) + 1 || this.length); this.length = from < 0 ? this.length + from : from; return this.push.apply(this, rest); }; //Equals Function taken from: //http://stackoverflow.com/questions/7837456/comparing-two-arrays-in-javascript Array.prototype.equals = function (array) { // if the other array is a falsy value, return if (!array) return false; // compare lengths - can save a lot of time if (this.length != array.length) return false; for (var i = 0, l=this.length; i < l; i++) { // Check if we have nested arrays if (this[i] instanceof Array && array[i] instanceof Array) { // recurse into the nested arrays if (!this[i].equals(array[i])) return false; } else if (this[i] != array[i]) { // Warning - two different object instances will never be equal: {x:20} != {x:20} return false; } } return true; } array = []; array.push (["Mozilla","Firefox",1.10]); array.push (["Microsoft","Spartan",1.0]); array.push (["Safari","Safari",1.4]); index = indexOfArr(array,["Mozilla","Firefox",1.10]); array.remove(index, index); document.getElementById("length").innerHTML = array.length; for(var i = 0; i < array.length; i++){ document.getElementById("elems").innerHTML += "<br>"+array[i]; } function indexOfArr(hay, needle){ for(var i = 0; i < hay.length; i++){ if (hay[i].equals(needle)){ return i; } } return -1; } 
 <span id = "length"></span><br> <span id = "elems">Elements:</span> 

您可以使用更fiter方法,而不是indexOf

在该方法的回调中,可以选择不同的方法:

  • 在数组上使用toString并比较两个字符串

  • 通过迭代包含的元素来测试长度和内容

  • ...继续...

在任何情况下,使用===都可以解决问题,除非所包含的对象与您要匹配的对象完全相同。 同样,我的意思是一样的。 我们不是在谈论拥有相同的内容,而是成为相同的实例。

遍历数组并检查是否相等:

array = [];
array.push(["Mozilla", "Firefox", 1.10]);

for (var i = 0; i < array.length; i++) {
    if (arraysEqual(array[i], ["Mozilla", "Firefox", 1.10])) {
        array.splice(i, 1);
    }
}

function arraysEqual(a, b) {
    if (a === b) return true;
    if (a === null || b === null) return false;
    if (a.length != b.length) return false;

    for (var i = 0; i < a.length; ++i) {
        if (a[i] !== b[i]) return false;
    }
    return true;
}

JSFiddle: http : //jsfiddle.net/ghorg12110/r67jts35/

基于这个问题: 如何用JavaScript检查两个数组是否相等?

你可以做这样的事情

array = []
array.push (["Mozilla","Firefox",1.10])
tempArray = array[0];
index = tempArray.indexOf("Mozilla","Firefox",1.10)
array.splice(index, 1)

如果放置for循环而不是硬编码,则可以以此for

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM