我有一个数组,arr = [0,0,0,0,1,1]。传递给函数的参数包含此数组以及在此示例中恰好为1的数值。我的函数称为pairwise,看起来像这样:
function pairwise(arr, arg) {
...some code ...
}
pairwise([0, 0, 0, 0, 1, 1], 1);
如果数组中的元素对加起来传递给函数的第二个参数,那么我需要添加每个唯一对的索引并返回索引的总和。对于这个例子,总和将是10,因为索引0和4加1,索引1和5加1,所以索引0 + 4 + 1 + 5 = 10的总和。我不能计算两次相同的索引。
在我的函数中,我从一个循环遍历数组长度的for循环中的arr [i]中减去arg。然后我从该减法中获取结果并使用arr.indexOf(result)查找索引对(如果存在)。在遇到这个问题之前一切正常。 indexOf只查找第一次出现,当我运行我的代码时,它不计算arr中的第二个1,所以我无法获得第二对。我的总和是4,应该是10.这是我的其余代码:
function pairwise(arr, arg) {
var array = [];
if (arr.length != 0) {
for (var i=0; i<arr.length; i++) {
if (arr.indexOf(arg - arr[i]) != -1) {
if (array.indexOf(i) === -1 && array.indexOf(arr.indexOf(arg-arr[i])) === -1) {
if (i !== arr.indexOf(arg - arr[i])) {
array.push(i,arr.indexOf(arg - arr[i]));
}
}
}
}
} else {
return 0;
}
console.log (array);
return array.reduce(function(a,b) {return a+b;});
}
pairwise([0, 0, 0, 0, 1, 1], 1);
我还将结果推送到数组中,因此我仅限于Array.prototype方法。我试着寻找其他方法,但我找不到任何可以用我正在做的事情来实现的方法。也许您知道一种更简单的方法吗?我的问题是,有没有办法看看indexOf的第一个索引匹配。我应该使用其他方法来解决我的问题吗?
答案 0 :(得分:2)
我的问题是,有没有办法看一下indexOf的第一个索引匹配。
您可以使用indexOf
fromIndex
indexOf()方法返回可在数组中找到给定元素的第一个索引,如果不存在则返回-1。
<强>的fromIndex:强>
开始搜索的索引。如果索引大于或等于数组的长度,则返回-1,这意味着将不搜索该数组。如果提供的索引值为负数,则将其作为数组末尾的偏移量。注意:如果提供的索引为负数,则仍会从前到后搜索数组。如果计算的索引小于0,则将搜索整个数组。默认值:0(搜索整个数组)。
示例:
var arr = [0, 0, 1, 2, 3];
alert(arr.indexOf(0, arr.indexOf(0) + 1)); // to get the index of second zero
&#13;
答案 1 :(得分:2)
要获取值的所有索引,可以使用Array.prototype.reduce函数返回匹配的所有索引的数组。
function indexAll(array, match){
return array.reduce(function(inds,val,i){
if(val == match) inds.push(i);
return inds;
},[]);
}
// indexAll([0,1,2,3,2,3,2,1,0], 2) will be [2, 4, 6]
// indexAll([0,1,2,3,2,3,2,1,0], 4) will be []
// indexAll([0,1,2,3,2,3,2,1,0], 0) will be [0, 8]
但是对于您正在寻找的用途,最好处理一个数组副本,然后删除已经使用过的项目。
function pairwise(arr, arg) {
var indexSum=0;
var arrCopy = arr.slice(0); // copy of array to modify
var len=arr.length; // cached for performance
for (var i = 0; i < len ; i++) {
if( arrCopy[i] !== undefined){ //only check if index has not been used
// var j =arrCopy.indexOf(arg -arrCopy[i]);
// if(j > -1 && i != j){
// sumIndex += i + j; // add the indexes
// delete arrCopy[i]; // delete indexes
// delete arrCopy[j];
// }
for(var j = i+1; j < len; j++){
if (arrCopy[j] !== undefined) {
if (arrCopy[i]+arrCopy[j] == arg){
indexSum += i + j; // add the indexes
delete arrCopy[j]; // sets arrCopy[j] to undefined to stop reuse
j = len; //jump to next i value
}
}
}
}
}
return indexSum
}
我没有使用indexOf,而是使用了嵌套for循环,因为for循环通常更快。 indexOf实现被注释掉了。见indexOf vs. for loop