2012-01-27 3 views
0

배열 요소에 포함 된 개체 참조를 다른 인덱스로 교체하고 이전 인덱스를 제거/삭제할 수 있습니까?Javascript는 다른 인덱스에 배열 요소를 교환하고 이전 인덱스를 제거합니다.

예 : I 인덱스 A, B, C와 오브젝트의 배열, D.

는 이제 지수 F와 새로운 배열 요소를 생성하고 그것을 대상물의 기준을 지정할가 해당 인덱스 B 포함. 그 후 배열에서 B를 제거하여 A, C, D, E 만 남기를 원합니다.

은 무엇 기본적으로 내가하고 싶은 E.

에 인덱스 B에 포함 된 객체의 참조를 복사하고 복사 할 수 없습니다 나는 아래의 코드를 시도했지만 작동하지 않습니다

this.cache['A'] = new Orange(1); 
this.cache['B'] = new Orange(2); 
this.cache['C'] = new Orange(3); 
this.cache['D'] = new Orange(4); 

// I want to pass the reference B contains 
// and assign it to F (like something you can do in C++) 
this.cache['E'] = this.cache['B']; 

// First attempt 
// length of array is 5 (cache['B'] just has value of undefined) 
delete this.cache['B']; 

// Second attempt 
// the reference to object Orange was deleted in both B and E 
this.cache.splice('B', 1); 

개체에 대한 많은 참조와 바인딩이 있기 때문에 새 개체를 만들고 값을 다시 할당하지 않으므로 전체 복사본을 수행하는 것이 의미가 없습니다.

답변

1

"splice"방법이 해결책이 아닌 이유가 궁금합니다.

내 샘플 코드를 확인하십시오. 나는 거기에 스플 라이스를 사용하고 어떤 참조도 손실되지 않습니다 ...

function Oo(s) { 
    this._s = s; 
} 

Oo.prototype.toString = function() { 
    return "-" + this._s+"-"; 
} 

var a = []; 
a.push(new Oo('x')); 
a.push(new Oo('y')); 
a.push(new Oo('z')); 

a[3] = a[1]; 
alert(a); // -x-,-y-,-z-,-y- 

a[3]._s = 'XX'; // let's change the newly added item 
alert(a); // -x-,-XX-,-z-,-XX- <- 3 and 1 points to the same object! 

a.splice(1, 1); // remove one element, starting from index = 1 
alert(a); // -x-,-z-,-XX- 
+0

새로 만든 요소에 잘못된 색인 (예 : [3])으로 액세스하려고했습니다. 배열 요소가 슬라이스 된 후 모든 인덱스가 이동되므로 인덱스 "1"을 삭제하면 "2"에서 "1"로, "3"에서 "2"로 변경됩니다. 나는 연관 어레이와 같은 배열로 작업하려고했는데, 왜 그것이 문제가 있었는지에 대한 것이었다. – peter

0

개체 속성을 설정 해제하려면 "delete"연산자를 사용할 수 있습니다. 예 :

var f ={ 
    test1: "fire", 
    test2: "water" 
} 
console.log(f.test2) 
//Output water 
delete f.test2; 
console.log(f.test2) 
//Output undefined 

전체적인 문제를 해결하려면 다음과 비슷한 방법을 사용하십시오.

this.cache['A'] = new Orange(1); 
this.cache['B'] = new Orange(2); 
this.cache['C'] = new Orange(3); 
this.cache['D'] = new Orange(4); 
this.cache['E'] = this.cache['B']; 
delete this.cache['B']; 
+0

"해결 된"코드는 질문 자체에 명시된 것입니다. 차이를 이해할 수 없습니다! – rsmoorthy

+0

그 이상의 내용을 읽으면 나는 진짜 차이가 없다고 말할 수 있습니다. op가 자신의 질문에 대한 답변을 게시 한 것은 너무도 마찬가지입니다. – CBusBus

0

개체 참조가 E로 더 이상 존재하지 않습니까?

이 코드 :

var cache = {}; 
cache['B'] = new Object({"hello": "world"}); 
cache['E'] = cache['B']; 
delete cache['B']; 

이제 캐시 [ 'E'는] 아직도이 [ 'B'를] 캐시 할당 된 개체를 포함합니다.

> cache['E'].hello 
"world" 
> 
0

다음 중 충분한 것이 있습니까?

var myArray= ['a','b','c','d']; 
myArray[4] = myArray[1]; 
myArray.splice(1,1) 
var stuff = myArray.join(""); 
document.write(stuff) 

결과 :

this post

0

에서 봐 ACDB 난 당신이 배열 객체를하지 사용 바랍니다. Javascript에 객체에 대한 속성이 없습니다. length

배열로. 배열로 선언 된 경우에도 값이 배열에 추가되지 않습니다 (예 : PHP 등). 대신 속성으로 추가되었습니다. 그래서 길이는 항상 0이 될 것입니다.

this.cache = []; 
this.cache['A'] = 1; 
this.cache['B'] = 2; 
this.cache['C'] = 3; 
this.cache['D'] = 4; 
this.cache['E'] = this.cache['B']; 
delete this.cache['B']; 
console.log(this.cache['B'], this.cache.length, this.cache.hasOwnProperty('B')); 

위의 예에서 볼 수 있듯이 this.cache은 배열로 사용되지 않습니다. 그래서 당신은 생성하고 반대 할 수 있습니다.

this.cache = {}; 
this.cache['A'] = 1; 
this.cache['B'] = 2; 
this.cache['C'] = 3; 
this.cache['D'] = 4; 
this.cache['E'] = this.cache['B']; 
delete this.cache['B']; 
console.log(this.cache['B'], this.cache.length, this.cache.hasOwnProperty('B')); 

두 경우 모두 hasOwnProperty('B')은 false를 반환합니다. 객체의 속성이 B이면 hasOwnProperty이 true를 반환합니다. 첫 번째 방법이 효과적입니다.

http://jsfiddle.net/diode/hfLJz/1/

.

관련 문제