2015-07-16 2 views
1

У меня есть массив, arr = [0, 0, 0, 0, 1, 1]. Аргумент, передаваемый в функцию, содержит этот массив, а также числовое значение, которое в этом примере составляет 1. Моя функция называется попарно и выглядит следующим образом:Метод массива Javascript для поиска indexOf за первым значением

function pairwise(arr, arg) { 
    ...some code ... 
} 
pairwise([0, 0, 0, 0, 1, 1], 1); 

Если элемент пара в массиве добавляет до второго аргумента, переданного в функцию, то мне нужно добавить индексы каждой уникальной пары и вернуть сумму индексы. Для этого примера сумма будет равна 10, потому что индекс 0 и 4 добавляется к 1, а также индекс 1 и 5 добавляют к единице, поэтому сумма индексов 0 + 4 + 1 + 5 = 10. Я не могу считать тот же показатель дважды.

Внутри моей функции я вычитаю arg из arr [i] внутри цикла for, который петли по длине массива. Затем я беру результат этого вычитания и использую arr.indexOf (result), чтобы найти пачку индексов, если она существует. Все работает нормально, пока я не столкнулся с этой проблемой. indexOf ищет только первое вхождение, и когда я запускаю свой код, он не учитывает второй 1 в arr, поэтому я не могу получить вторую пару. Моя сумма 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. Должен ли я использовать другой метод для моего решения?

ответ

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 я использовал вложенный цикл, поскольку для циклов, как правило, быстрее. реализация indexOf закомментирована. см. indexOf vs. for loop

1

Мой вопрос в том, есть ли способ посмотреть первое совпадение индекса indexOf.

Вы можете использовать второй параметр fromIndex из indexOf

Метод 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

Смежные вопросы