2013-03-03 4 views
1

배열에서 정의 된 값의 모든 인스턴스를 스플 라이스하려고합니다.자바 스크립트 : 배열 요소의 모든 인스턴스를 연결

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; 
     }, 

필자는 원하지 않는 인자를 함께 전달합니다.

내가 겪는 문제점은 splice 기능이 값의 모든 인스턴스를 스플 라이스하지 않는다는 것입니다.

예 : 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"가 전달 된 경우 전달 된 다른 인수가 들어 있습니다. 그래서 임의의 요소가 인수 [j] – swaggyP

답변

1

추가 난 - 당신이 그렇지 않으면 스플 라이스 후 문자열을 단축하고 당신은 고려해야 할 가치를 놓칠 것

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

과 같은지 anyArray 검사를 통해 증가시킵니다. JS가 함수 유효 범위 인 반면 블록 범위 인 것처럼 여기에 "var"을 추가합니다. 모든 var 선언을 루프 외부로 이동합니다 (var i, v, j; for (i = ...) 등 =). –

0

Underscore 포함을 유용한 도우미 기능이 많이 있고 uniq은 당신이 찾고있는 것일 수도 있습니다.

전체 라이브러리가 아닌 해당 기능을 원할 경우 source code을 살펴보십시오.

+0

언더 코어 .js를 사용하고 싶지 않습니다. – swaggyP

+0

괜찮습니다. – Stefan

0

anyArray.splice (...)는 배열의 요소 수와 기존 요소의 인덱스를 변경합니다. 당신은 당신이 요소

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

오, 그게 혼란을 해결해줍니다. 고맙습니다. user1580941 – 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

내가 자바 스크립트에서 좋은 아니에요,하지만 삭제 배열 항목은 크기를 줄이고 같은 경우 뒤로 순서를 통해 루프 좋다.

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

줄이려면 splice가있는 배열을 사용할 수 있습니다. 다음은 간단한와 접합을 이용하여 예를 줄일

우리가 배열 a를 가지고 당신이 볼 수있는 콘솔에서 배열 a를보기 'D'

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

의 모든 인스턴스를 제거 할 말은 지금

때문이다
["a", "b", "c"] 

그러나 splice는 각 호출에서 순서 n이어서 모든 연속 요소를 이동합니다. 매우 큰 데이터 세트로 작업하기를 통해 단지 루프 더 나은 물론 푸시에게

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

를 사용할 수있는 경우이 배열를 변이하지 않습니다.콘솔에서 당신이

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

내가 대신 같은 두 번째 배열을 보낼 것이다 B를 참조 배열을보기 : 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; }); 
}