2013-01-29 4 views
-1

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

// array 1 
function gdb() { 
    this.data = [{ 
     "id":"AA", 
     "pos": "0" 
    }, 
    { 
     "id":"AB", 
     "pos":"3" 
    } 
    ] 
    ; 
} 

// array 2 
function xdb() { 
    this.data = [{ 
     "id":"CM", 
     "pos": "4" 
    }, 
    { 
     "id":"CR", 
     "pos":"7" 
    } 
    ] 
    ; 
} 

// arrays combined 
function gdb() { 
    this.data = [{ 
     "id":"AA", 
     "pos": "0" 
    }, 
    { 
     "id":"AB", 
     "pos":"3" 
    }, 
    { 
     "id":"CM", 
     "pos": "4" 
    }, 
    { 
     "id":"CR", 
     "pos":"7" 
    } 
    ] 
    ; 
} 
+1

Лучше всего использовать [ 'Array.concat()'] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/concat) (это возвращает новый массив). Вы также можете использовать повторные вызовы в 'Array.push()' – NullUserException

+0

@NullUserException Я не уверен, что это по ссылке - см. Https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/concat – bfavaretto

+1

Каждый раз, когда вы создаете экземпляр объекта 'gdb' или' xdb', вы создаете новый массив. – zzzzBov

ответ

1

Чтобы объединить массивы, просто используйте их concat method. Однако я не уверен, что вы имеете в виду «по ссылке». Новый массив (который содержит все значения) свойства будет указывать на те же объекты, что и свойства двух отдельных массивов. Тем не менее, новый массив не изменится, если вы присвоите новые объекты старым свойствам массива, это совершенно невозможно.

0

Массивы - это объекты, и по умолчанию они передаются по ссылке. Я не уверен, что вы пытаетесь использовать эти функции в качестве конструкторов (похоже, это так). Это то, что тебе надо?

function ConstructorOne() { 
    this.data1 = [ 
     {"id":"AA", "pos":"0"}, 
     {"id":"AB", "pos":"3"} 
    ]; 
} 

function ConstructorTwo() { 
    // Inheritance 
    ConstructorOne.call(this); 

    this.data2 = [ 
     {"id":"CM", "pos":"4"}, 
     {"id":"CR", "pos":"7"} 
    ]; 
} 

var obj = new ConstructorTwo(); 
obj.data = obj.data1.concat(obj.data2); 

// Delete old ones if not needed - don't otherwise 
//delete obj.data1; 
//delete obj.data2; 

// Making changes to the data property, will also 
// change data1 & data2 from the constructors, proving 
// that data is just a reference of data1 + data2 
obj.data[2]['id'] = "PIZZA"; 
obj.data[1]['id'] = "APPLE"; 
obj.data[0]['id'] = "LETTUCE"; 

console.log(obj); 
+0

Нет, вы не меняете свойство 'data', а объекты в массиве. – Bergi

+0

Значение свойства data - это массив объектов. Если я изменяю объекты, это означает, что свойство данных, которое является массивом, теперь содержит разные данные - или объекты разных данных. Следовательно, свойство данных теперь изменено. Имеет смысл? – istos

+1

Да, но я думаю, что «проведение модифицированных объектов» является лучшей формулировкой, поскольку технически вы не изменяете массив, а объекты, на которые он ссылается. – Bergi

Смежные вопросы