Javascript按值

时间:2015-07-02 11:16:15

标签: javascript arrays

我有一个javascript数组,我想根据数组的值删除一个元素,这是我的数组,这是我试过没有成功的。

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

但它不起作用,任何想法?

5 个答案:

答案 0 :(得分:2)

您正在尝试比较阵列,这些阵列是对象并具有唯一的地址。您的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);

答案 1 :(得分:2)

看看这个:

// 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的创造者制作的功能。 基本上你采取一件事的索引,而不是它被删除

&#13;
&#13;
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;
}
&#13;
<span id = "length"></span><br>
<span id = "elems">Elements:</span>
&#13;
&#13;
&#13;

答案 2 :(得分:1)

您可以使用fiter metodh代替indexOf

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

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

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

  • ...继续......

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

答案 3 :(得分:1)

遍历数组并检查相等性:

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/

基于这个问题:How to check if two arrays are equal with JavaScript?

答案 4 :(得分:1)

你可以做这样的事情

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

如果您使用for循环而不是硬编码,则可以在此基础上构建。