Javascript поменять элемент массива на другой индекс и удалить старый индекс - PullRequest
0 голосов
/ 27 января 2012

Можно ли поменять ссылку на объект, содержащийся в элементе массива, на другой индекс и удалить / удалить старый индекс.

Пример: у меня есть массив ОБЪЕКТОВ с индексами A, B, C, D.

Теперь я хочу создать новый элемент массива с индексом F и назначить ему ссылку на объект, содержащийся в индексе B.После этого я хочу удалить B из массива так, чтобы остались только A, C, D, E.

Что я в основном хочу сделать, это скопировать ссылку на объект, который содержит индекс B, и скопировать его вE.

Я пробовал приведенный ниже код, но он не работает:

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);

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

Ответы [ 5 ]

0 голосов
/ 27 января 2012

Мне интересно, почему метод "сращивания" не является решением.

Посмотрите на мой пример кода. Я использую сращивание там, и никаких ссылок не теряется ...

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 голосов
/ 27 января 2012

Я надеюсь, что вы используете объект, а не массив.Нет свойства length для объекта в Javascript.

Как массив.Здесь, даже если он объявлен как массив, значения не добавляются в массив (как в php и т. Д.).Вместо этого добавлено как свойства.Так что длина всегда будет нулевой.

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/

.

0 голосов
/ 27 января 2012

Вы уверены, что ссылка на объект больше не существует с E?

Этот код:

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

Теперь кеш ['E'] по-прежнему содержит объект, который был назначен кешу ['B'].

> cache['E'].hello
"world"
>
0 голосов
/ 27 января 2012

Достаточно ли следующего?

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

Результат: acdb

Взгляните на это сообщение

0 голосов
/ 27 января 2012

Для сброса свойства объекта вы можете использовать оператор «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'];
...