2013-03-03 2 views
1

Я пытаюсь объединить все экземпляры определенного значения из массива.Javascript: объединение всех экземпляров элемента в массиве

filterfunc: function(anyArray){ 
     for(var i = 0; i <anyArray.length; i++){ 
     var v = anyArray[i]; 
      for(var j = 1; j <arguments.length; j++){ 
      if(v == arguments[j]){ 
       anyArray.splice(i,1); 
      } 
      } 
     } 
      return anyArray; 
     }, 

Пропускаю массив вместе с аргументами, которые мне не нужны.

Проблема, с которой я сталкиваюсь, заключается в том, что функция сращивания не объединяет все экземпляры значения.

например: filterfunc([1,2,2,2,3,3,3,4,5,6],2,3); результат: [1,2,3,3,4,5,6]

Я хочу, чтобы вернуться [1,4,5,6]

+0

Какие критерии вы используете, чтобы решить, если вы удалите значение из массив или нет? – christopher

+0

, если массив передал «anyArray», содержит любой из переданных аргументов. Таким образом, я увеличиваю счет anyArray, если какой-либо элемент совпадает с аргументами [j] – swaggyP

ответ

1

Добавить i-- после сращивания в противном случае строка будет сократить, и тогда вы пропустите значения, которые будут рассмотрены:

http://jsfiddle.net/6HatJ/1/

function filterfunc(anyArray){ 
    for(var i = 0; i <anyArray.length; i++){ 
    var v = anyArray[i]; 
     for(var j = 1; j <arguments.length; j++){ 
     if(v == arguments[j]){ 
      anyArray.splice(i,1); 
      i--; 
     } 
     } 
    } 
     return anyArray; 
    }; 
+0

, обратите внимание, что вы добавляете «var» здесь, как если бы он был блочным, тогда как JS является областью действия. Переместите все эти объявления var вне циклов (var i, v, j; for (i = ...) и т. Д. =). –

0

Underscore содержит многие полезные вспомогательные функции и uniq могут быть именно тем, что вы ищете.

Если вы просто хотите эту функцию, а не всю библиотеку, вы просто посмотрите на source code.

+0

Я не хочу использовать underscore.js – swaggyP

+0

нормально, справедливо. – Stefan

0

anyArray.splice (...) изменяет количество элементов в массиве и, следовательно, индексы существующих. Вы должны уменьшить индекс на единицу каждый раз, когда вы удаляете элемент

anyArray.splice(i--,1); 
+0

О, это очищает путаницу. Спасибо пользователю1580941 – swaggyP

0

Давайте использовать Foreach, а также отмечают, что сращивание является функцией на месте. Возвращение массива просто дает нам ссылку, что мы уже имели:

function remove(arr,elements) { 
    elements.forEach(function(e) { 
    for(var i=arr.length-1; i>=0; i--) { 
     if(arr[i]==e) { arr.splice(i,1); } 
    } 
    }); 
} 

// test 
var a = [1,2,3,3,3,3,4,5,5,6,7,7], 
    b = [3,5,7]; 
remove(a,b); 
a; 
3

Я не очень хорош в JavaScript, но удаление элементов массива уменьшить их размер, и в таком случае хорошо перебрать в обратном порядке.

for(var i = anyArray.length-1; i>0; i--){ 
    var v = anyArray[i]; 
    for(var j = 1; j <arguments.length; j++){ 
     if(v == arguments[j]){ 
     anyArray.splice(i,1); 
     } 
    } 
} 
+0

Ничего себе, так много ответов здесь ... Я обновляю перед публикацией :) –

0

Как насчет цикла while.

function removeInstanceOfElement(elem, arr) 
{ 
    var index = 0; 

    while(index < arr.length) 
    { 
     if(arr[index] == elem) 
     { 
      arr.splice(index, 1); 
      index = 0; 
     } 
     else 
     { 
      ++index; 
     } 
    } 

    return arr; 
} 
0

Вы можете использовать сокращение, чтобы пройти через массив со сращиванием. Вот простой пример использования сращивания с уменьшить

Скажем, у нас есть массив а и хотите удалить все экземпляры «D»

a = ['a', 'b', 'd', 'c', 'd']; 
a.reduce((prevValReturned, currVal, currIndex, array) =>{ 
    if (currVal == 'd') a.splice(currIndex, 1); 
}, 0); 

Просмотр в массиву в консоли вы видите, что теперь

["a", "b", "c"] 

Однако сплайсинг является порядком n для каждого вызова, сдвигая все последующие элементы. Если работа с очень большим набором данных может быть лучше всего прорваться и использовать push

a = ['a', 'b', 'd', 'c', 'd']; 
b= [] 
a.reduce((prevValReturned, currVal, currIndex, array) =>{ 
    if (currVal != 'd') b.push(currVal); 
}, 0) 

Конечно, это не мутирует массив a.Просмотр массива б в консоли вы видите

["a", "b", "c"] 
2

Я бы вместо того, чтобы послать второй массив, такие как: filterfunc([1,2,2,2,3,3,3,4,5,6],[2,3]) и использовать Array.prototype.filter():

function filterfunc(a, b) { 
    return a.filter(function(x) { return b.indexOf(x) == -1; }); 
} 
Смежные вопросы