我正在尝试在数组中找到数组的索引,但我忘记了一些步骤,而且我不确定是否需要另一个循环。
我将从一个包含推送值的数组开始,如下所示:
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
}
提前致谢!
答案 0 :(得分:1)
使用if子句测试两个值amt
和date
是否匹配。然后将匹配的索引存储在一个数组中。循环该数组以从支付数组中删除匹配的索引。
// 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;
}
}
演示:
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;
答案 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());