2013-07-02 6 views
1
var cache = []; 
cache[0] = "0"; 
cache[1] = "1"; 
cache[2] = "2"; 
cache[3] = "3"; 
cache[4] = "4"; 
cache["r"] = "r"; 
console.log(cache.length); 
for(key in cache){ 
    if(isNaN(key))continue; 
    else cache.splice(key,1); // cache.splice(key) is working fine, *** 
} 
console.log(cache); 

질문 작동하지 : 라인 ***에 왜 스플 라이스 (키) (숫자 인덱스 모든 요소를 ​​삭제) 잘 작동되고 스플 라이스 (키, 1) 숫자 인덱스와 미세 (삭제하지 요소를 작동하지). 심지어 내가자바 스크립트 배열 스플 라이스 잘

splice(key,1) // Not working as splice(key) 
splice(key--,1) // Even not working as splice(key) 
splice(key,0) // not deleting any thing 

당신은 테스트를 위해 방화범 콘솔에서 복사 및 붙여 넣기 코드를 수있는 노력했다.

+3

"작동하지 않음"을 명확히 할 수 있습니까? 코드를 사용해 보면 어떻게되며 어떻게 예상과 다른가? 오류 메시지가 나타 납니까? – Guffa

+0

splice 함수는 배열에서 요소를 삭제합니다. 그것은 숫자 인덱스와 함께 모든 요소를 ​​삭제해야하지만 그 중 일부는 제거하기 때문에 –

+0

splice는 숫자 인덱스를 제공 할 것으로 예상하므로 (n, x)는 숫자 인덱스 n에서 시작하고 인덱스 n 다음에 x 값을 제거한다는 의미입니다. n이 숫자가 아니라 키이면 x가 필요 없다. 그래서 그것은 잘 작동 x는 제거됩니다. –

답변

1

스플 라이스 숫자로 첫 번째 인덱스를 기대하고,

splice(n,x); //n and x are numeric here 

인덱스 n에서 시작하여 배열에서 값을 제거하고 인덱스 n 다음에 x 값을 제거하기 시작합니다.

if n is not numeric but a key 이제 x는 연관 배열이 아닌 numeric-indexed array에서 포인터를 앞으로 이동할 수 있기 때문에 x가 필요 없습니다. 그래서 splice (n, x)에서 x를 제거하면 splice (key)와 유사한 함수가되므로 잘 작동합니다.

+0

연관 배열에서 요소를 제거하는 좋은 방법을 찾고 있습니다. 이 답변에 따르면 [this] (http://jsfiddle.net/AL5LG/)는 콘솔에서 볼 수있는 것처럼 작동해야하지만 연관 배열에는 아무런 영향을 미치지 않습니다. 'delete'를 사용하면 [this example] (http://jsfiddle.net/AL5LG/2/)처럼 작동합니다 ('.length' 속성이 비정상적으로 작동하는 것으로 보입니다). – JVE999

+0

splice (key)가 작동하고 splice (key, x)가 작동하지 않습니다. 스플 라이스 기능에서 두 번째 매개 변수 만 제거하면됩니다. –

+0

당신이 옳은 답을 찾았 으면 그 대답이 더 좋은지 확인해보고 그 중 하나를 선택하겠습니다. –

2

1) cache["r"] = "r"; 배열에 요소를 추가하지 않습니다, 그것은 당신이

var cache = ["0", "1", "2", "3", "4", "r"]; 

또는

같은 어떤 것을 사용할 수있는 배열을 초기화하려면 캐시 개체

에 속성을 추가합니다

var cache = new Array(); 
cache.push("0"); 
cache.push("1"); 
cache.push("2"); 
cache.push("3"); 
cache.push("4"); 
cache.push("r"); 

캐시 개체가 배열이 아니므로 splice가 배열에서와 같이 작동 할 것으로 예상 할 수 없습니다.

2) 스플 라이스는 첫 번째 인수가 아닌 키

http://www.w3schools.com/jsref/jsref_splice.asp

그래서 모든 숫자 값을 제거하려면이 옵션을 사용할 수 있습니다 참조로 인덱스를 기대 : 그것은 때문에 작동하지 않습니다

for (var i = 0; i < cache.length; i++) { 
     if (!isNaN(cache[i])) { 
      cache.splice(i, 1); // cache.splice(key) is working fine, *** 
       i--; 
      } 
     } 
+0

키 또는 색인이 동일합니다. 나는 자바 스크립트, 숫자 배열이 아닌 연관 배열을 처리하고있다. 연관 배열 및 JSON에 대해 자세히 알아 보려면 Google을 검색하십시오. :) –

+0

이 질문에 대한 답변에 따르면 http://stackoverflow.com/questions/948894/splicing-a-string-indexed-array-in-javascript를 사용할 수 있습니다. splice 대신 delete를 사용하면 splice (key, 1)가 작동하지 않는 이유는 모르겠지만 문자열 인덱스 배열에서 삭제하는 것이 적절합니다. –

+0

연관 배열을 조사한 후 필자는 답을 고지합니다. 'cache'는 배열이 아니므로 splice가 동작하는 것처럼 기대할 수는 없습니다. –

7

키를 반복하면서 배열에서 항목을 제거하고 있습니다. 항목을 제거하면 배열이 내부적으로 구현되는 방식에 따라 다른 항목이 다시 배열되고 예상되는 키를 반복하지 않는 루프가 생깁니다.

Firefox에서 시도하면 키 0, 1, 2r에 대해서만 반복됩니다. 반복하는 동안 항목을 제거하면 34을 건너 뜁니다. splice 자체는 정상적으로 작동하지만 루프에 영향을 주어 일부 항목은 반복되지 않습니다.

숫자가 아닌 키를 건너 뛰고 배열의 인덱스를 실제로 찾고 있으므로 대신 색인을 반복 할 수 있습니다. 거꾸로 그들을 통해 반복하여 배열이 그것을 통해 동안 루프를 변경하여 문제를 얻을하지 않습니다

데모
var cache = ["0", "1", "2", "3", "4"]; 
cache.r = "r"; 
console.log(cache.length); 
for (var i = cache.length - 1; i >= 0; i--) { 
    cache.splice(i, 1); 
} 
console.log(cache); 

: http://jsfiddle.net/CguTp/1/

+0

역순으로 제거하는 것은 좋은 생각이지만 연관 배열을 사용하고 있습니다. 당신은 –

+0

내 질문에 왜 splice (key, 1) splice (key)가 아주 잘 작동하는 동일한 장소에서 작동하지 않는 이유입니다. –

+0

@Wasim :'splice (key) '를 사용하면 코드가 모든 항목을 제거하려고 시도 할 때와 같은 결과 만 나타납니다. 첫 번째 반복에서 배열의 모든 항목을 제거하므로 한 번에 하나의 항목을 제거하지 않습니다. – Guffa