数组中具有两个值的数组索引,例如[[“val1”,“val2”],...]

时间:2015-03-10 22:00:37

标签: javascript arrays

我正在尝试在数组中找到数组的索引,但我忘记了一些步骤,而且我不确定是否需要另一个循环。

我将从一个包含推送值的数组开始,如下所示:

var payments = [["2015-03-10", "100.00"],["2015-03-11", "14.00"]];

当我点击具有相似值的按钮时,我想将其从数组中删除。

我的按钮将具有onclick功能,如下所示:

onclick="removePayment(this.value)"

按钮的值如下所示:

value="' + payments[i][0] + ': $' + payments[i][1] + '"

基本相同:2015-03-10:$ 100.00

然后我会(通过onclick将值作为参数传递),重新创建它作为数组值出现的方式,希望我现在可以在“payments”数组中捕获它的索引。

        // We start with a string, like: "2015-03-10: $100.00"
        var amt = val.split(':')[0]; // 100.00
        var date = val.split('$')[1]; // 2015-03-10
        var temp = (amt + ',' + date).split(','); // ["100.00", "2015-03-10"]
        console.log(temp);

        for (i = 0; i < payments.length; i += 1) {
           console.log(payments[i].indexOf(temp)); // returns -1

        }

提前致谢!

3 个答案:

答案 0 :(得分:1)

使用if子句测试两个值amtdate是否匹配。然后将匹配的索引存储在一个数组中。循环该数组以从支付数组中删除匹配的索引。

    // We start with a string, like: "2015-03-10: $100.00"
    var date = val.split(':')[0]; // 100.00
    var amt = val.split('$')[1]; // 2015-03-10

    var indices = [];
    for (i = 0, max = payments.length; i < max; i += 1) {
       if (payments[i][0] == date && payments[i][1] == amt)
       {
           indices.push(i);
       }
    }

    indices.map(function(element){
        payments.splice(element, 1); //delete the indices from the array.
    });

答案 1 :(得分:1)

您已交换了值,并将日期放在amt变量中,将金额放在date变量中。它应该是:

var date = val.split(':')[0]; // 2015-03-10
var amt = val.split('$')[1]; // 100.00

您正在使用循环和indexOf,但您只需要其中一个。即使它是您正在搜索的数组数组,您仍然只搜索外部数组中的项目,因为它是您要搜索的数组。

由于您没有搜索值而是搜索对象(数组是对象),因此您无法使用indexOf(因为两个不同的对象即使它们具有相同的值也不相等),所以使用循环并比较您要搜索的数组中的项目:

var index = -1;
for (i = 0; i < payments.length; i += 1) {
  if (payments[i][0] == date && payments[i][1] == amt) {
    index = i;
    break;
  }
}

演示:

&#13;
&#13;
var payments = [["2015-03-10", "100.00"],["2015-03-11", "14.00"]];

var val = "2015-03-10: $100.00";

var date = val.split(':')[0]; // 2015-03-10
var amt = val.split('$')[1]; // 100.00

var index = -1;
for (i = 0; i < payments.length; i += 1) {
  if (payments[i][0] == date && payments[i][1] == amt) {
    index = i;
    break;
  }
}

document.write(index);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

如果要查找出现子数组的数组中的索引/索引,可以使用map和filter的混合,但是还需要一个数组相等性检查函数。

让我们假设我们有Array.prototype.equals, per this SO answer,由@TomášZato礼貌,然后我们就可以做到:

haystackArray.map(function(e, i) { return e.equals(needleArray) ? i : false; })
             .filter(function(e) { return e !== false; });

这将返回一个匹配的标记数组(如果找不到needleArray,则返回一个空数组。)

// Array equality function by Tomáš Zato
// attach the .equals method to Array's prototype to call it on any array
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;
};

var subarrayIndexOf = function(haystack, needle) {
    return haystack.map(function(e, i) { return e.equals(needle) ? i : false; })
                   .filter(function(e) { return e !== false; });
};

var haystack = [ [1,2], [3,4], [5,6], [3,4] ],
    needle   = [3,4];

alert('subarray found at indices: ' + subarrayIndexOf(haystack, needle).toString());