2013-03-05 2 views
3

배열이 있는데 하나의 요소 만 제거하고 키는 재정렬하지 않고 제거하려고합니다. 삭제를 사용하거나 전체 어레이를 재구성하지 않고 쉬운 방법이 있습니까?정렬 키없이 js 배열에서 값을 제거하십시오.

또는 삭제 후에 정리하여 정의되지 않은 값을 없애고 길이를 다시 고정하십시오.

var array = ["valueone", "valuetwo"]; 

console.dir(array); // keys 0 and 1 
array.splice(0, 1); 
console.dir(array); // key 1 is now 0, do not want! 
+3

도움이? – j08691

+0

"제거"란 의미를 이해하고 있지만 array [index] = undefined와 같은 구문을 사용할 수는 없습니다. 또는 array [index] = null; ? –

+1

왜 이것을하고 싶습니까? – AD7six

답변

3

넌 배열의 요소를 delete

a = ['one', 'two']; 
delete a[0]; 

// a is now [undefined, 'two']; 

대안, undefined에 명시 a[0] 세트.

배열 .length 매개 변수는 시스템에서 자동으로 유지 관리됩니다. 이 의미는 받아 들일 수없는 경우,

a.length = 10; 
// a is now [undefined, 'two', undefined x 8] 

당신은 대신 Object 사용을 고려해야합니다 : 당신이 의도적으로 높은 숫자로 설정하면, 당신은 단지 누락 된 키에 대한 undefined 값의 전체 부하를 얻을 수 있습니다 . 이렇게하면 키가 유지되고 더 효율적이되지만 .length 속성을 잃게됩니다.

+0

"삭제 **를 사용하거나 전체 배열을 재구성하지 않고 쉬운 방법이 있습니까?" – j08691

+0

@ j08691 예, 그 비트를 놓쳤습니다. 그것은 인공적인 제약 조건입니다. 요소의 색인은 여전히 ​​'정의되지 않은'값과 함께 있습니다. – Alnitak

+0

좋은 답변, 많은 감사. 분명히 대신 객체로 이동하여 다른 방법으로 요소를 추적해야합니다. – Nuoun

1

값을 undefined 또는 null 또는 빈 문자열로 명시 적으로 설정할 수는 없습니다. 무엇을 성취하려고합니까?

var arr = ['aaaa','bbb','ccc','ddd']; 
    arr[0]= undefined; 
    //or 
    arr[0]= null; 
    ///or 
    arr[0]= ""; 
    arr.length; <--- 4 
+0

'.length'는 함수가 아닙니다 ... – Alnitak

+0

배열의 길이를 사용하고 싶습니다.이 값은 정의되지 않은 값으로는 올바르지 않습니다. 또한 나는 모든 키 입력으로 추가되기 때문에 키 값으로 "채우는"것에 대해 조금 걱정이됩니다. 그러나 명백하게 목표는 여기에가는 길입니다. – Nuoun

+0

확실합니다. 정의되지 않은 것을 할당 할 때도 테스트를 마쳤습니다. 여전히 길이가 4가됩니다. –

0

자바 스크립트의 delete 키워드를 사용할 수 있습니다. 당신이 할 수있는

delete array[index]; 

불행하게도,이

var arr = ['pie', 'cake', 'fish']; 
delete arr[1]; 
arr; // ['pie', undefined, 'fish'] 

배열의 내부에 undefined 인덱스를 생성합니다

var arr = [9,8,7,6]; 
arr[1] = null; 
arr;  // [9,null,7,6] 
arr.length; // 4 
var i = -1; 
while(++i < arr.length){ 
    if(arr[i] && typeof(arr[i] === "number")){ 
     alert(arr[i]); 
    } 
} 

또는, 당신은 배열을 사용할 필요가없는 경우 개체를 사용하여 모든 것을 더 쉽게 만들 수 있습니다.

var obj = { 
    0: "first", 
    1: "second", 
    2: "third" 
}; 
delete obj[1]; 
obj; // {0: "first", 2: "third"} 
for(var i in obj){ 
    alert(obj[i]); 
} 
,

는 객체의 길이 효율적으로 활용하려면 다음

getLength = function(obj){ 
    var i = 0, l = 0; 
    for(i in obj){ 
     l++; 
    } 
    return l; 
} 
getLength(obj); // 3 

을하지만 그건하지 이름, date of creation을 기준으로 정렬의 인덱스 개체를 기억한다. 그러나 이로 인해 도로 차단이 발생하지 않아야합니다.

순으로 객체의 인덱스를 정렬하려면 :

sortObject = function(){ 
    var arr = [], i; 
    for(i in this){ 
     arr.push({index:i,content:this[i]}); 
     delete this[i]; 
    } 
    arr.sort(); 
    for(i in arr){ 
     var item = arr[i]; 
     this[item.index] = item.content; 
    } 
    return this; // make chainable 
} 
var obj = { 
    acronym: "OOP", 
    definition: "Object-Oriented Programming", 
    article: "http://wikipedia.org/OOP" 
}; 
sortObject.apply(obj); // indices are "acronym", "article", "definition" 

희망이 삭제 사용에 대해 무엇을해야합니까

+0

놀라워요. 그게 많이 도움이 되었어, 고마워! – Nuoun

+0

@Nuoun 당신은 환영합니다 :) 다행스럽게 도와 줬어! –

관련 문제