2016-10-10 3 views
-3

у меня есть массив объектов следующим образом:Javascript: Добавление свойства в массиве объектов

var myarray=[{"name":"John","address":"home"},{"name":"Peter","address":"home"}] 

, и я хотел бы запустить функцию, чтобы добавить свойство в массив следующим образом:

[{"name":"John","address":"home","collection":"friend"}, 
{"name":"Peter","address":"home","collection":"friend"}] 

Я попытался сделать это:

myarray=myarray.map(function (err, myarray){ 
    myarray.collection="friend"; 
    return myarray; 
} 
console.log(myarray) 

Но консоль продолжает возвращать это:

[{0},{1}] 

Может ли кто-нибудь мне помочь? Спасибо

+0

Основная отладка с помощью 'console.log()' покажет проблему. –

+0

Я воспроизвел мое консольное сообщение в вопросе и не вижу, какие проблемы он раскрывает. – qts

+1

Указанный код не выводит результат, который вы требуете, он возвращает '[0, 1]' (при условии, что вы исправляете отсутствующую синтаксическую ошибку). Если вы попробовали 'console.log (myarray)' внутри обратного вызова, вы бы поняли, почему. – nnnnnn

ответ

3

Ваш код не добавляет свойство в содержимое массива. Значения массива задаются в качестве первого параметра функции обратного вызова (второй параметр - это индекс, а не сам массив - это третий параметр). Просто назначьте новое свойство первому параметру функции обратного вызова, а не второму.

Редактировать - Как @zerkms указывает, однако, если вы хотите обновить текущий массив, а не создать новый массив, map, вероятно, не лучшим решением здесь. forEach предоставляет метод для итерации по текущему массиву и изменение каждого из его значений (что вы делаете). Это будет похоже omething так:

myarray.forEach(function(value) { 
    value.collection = "friend"; 
}); 

Как вы заметили, в документации .map, функция обратного вызова возвращает новое значение, которое будет отображаться в новом массиве, который генерируется map; если вы меняете текущий массив на месте (т. е. изменяя свойства его содержимого), нет необходимости возвращать что-либо.

myarray.map(function(value) { 
    value.collection = "friend"; 
}); 

Также обратите внимание, что оба map и forEach методы, так что вам нужно, чтобы закрыть вызов метода с ).

+0

Его не добавление в массив, а временные индексы. Внутри функции 'myarray' является индексом. – Syntac

+2

Неверно использовать 'map' для мутации массива, на который он вызван. Вместо этого нужно использовать 'Array.prototype.forEach' – zerkms

+0

@Syntac Хорошая точка, получил порядок аргументов, немного запутанных там. – nbrooks

1

Все, что вам нужно сделать, это изменение опорного объекта в функции отображения

myarray.map(function (value){ 
    value.collection = "friend"; 
}); 

console.log(myarray); 
2

Неправильное использование карты(). Первый аргумент map() - это текущий элемент массива, второй аргумент - индекс.
Например:

['a','b','c'].map(function(element, index){console.log(element, index)}); 

будет приводить к

a 1 
b 2 
c 3 

Так внутри вашей функции myarray был ваш индекс, и вы пытаетесь добавить свойство индекса.

Теперь у вас есть варианты.Либо вы используете map() как это Мент использовать и присвоить это возвращаемое значение для myarray:

myarray = myarray.map(function(element) { 
    element.collection = "friend"; 
    return element; 
}); 

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

myarray.map(function(element) { 
    element.collection = "friend"; 
}); // returns [undefined, undefined ...] 

Это, однако, не так, как следует использовать map()

лучше: используйте forEach()

myarray.forEach(function(element) { 
    element.collection = "friend"; 
}); 

Надеюсь, это помогло. Приветствует!

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