#javascript #node.js #json
Вопрос:
У меня есть массив элементов json внутри json. Мне нужно добавить orderCustomerCount в объекты json и присвоить значение, например 1.
json-это вот что.
{
"docs": [
{
"vehicle": "moto",
"status": "confirmed",
"_id": 34401,
"service": "programmed"
},
{
"vehicle": "moto",
"status": "confirmed",
"_id": 34402,
"service": "programmed"
}
]
}
мой код таков
listOrders.docs.map((order)=>{
order.orderCustomerCount = 1
})
но когда я возвращаю ListOrders, не отображается этот новый атрибут orderCustomerCount.
Комментарии:
1. 1.
Array.map
возвращает новый массив 2. Внутри обратного вызова карты вам нужноreturn
что-то2. Используйте это, чтобы добавить новое свойство в свой массив
listOrders.docs.map((order)=> ({...order, orderCustomerCount: 1 }))
.
Ответ №1:
Метод array map
возвращает новый массив, вычисленный путем вызова predicate
в вашем случае (order) => { order.orderCustomerCount; return undefined; }
(подробное возвращение, функции эквивалентны) для каждого элемента массива и сохранения возврата в той же позиции в новом массиве.
[1, 2, 3, 4, 5].map((n) => 2 * n);
// returns [2, 4, 6, 8, 10]
В вашем случае вы возвращаетесь undefined
в предикате, потому что любая функция со стрелкой по умолчанию возвращает значение undefined.
В вашем случае более подходящим решением был бы метод массива forEach
.
listOrders.docs.forEach((order)=> {
order.orderCustomerCount = 1;
});
Этот метод вызывает только предикат для каждого элемента массива. Поскольку массивы и объекты являются ссылочными типами, значение элементов mutated
должно добавлять свойство.
Кроме того, вы можете подумать о том, хотите ли вы этого или нет. По моему собственному опыту, при использовании объектов и массивов, чтобы повысить предсказуемость, я редко использую назначения, вместо этого я создаю новые массивы новых объектов, чтобы гарантировать, что источник не мутирует.
let newOrders = listOrders.docs.map((order) => {
let newOrder = {
...order,
// copy all attributes (properties) of order
orderCustomerCount: 1,
// add orderCustomerCount property equal to 1
};
return newOrder;
})
Обратите внимание на синтаксис распространения.
Таким образом, исходный объект сохраняется как есть и newOrders
вместе с элементами массива может быть изменен независимо от него.
Ответ №2:
.map()
функция создает и возвращает новый массив. Вам нужно сделать следующее:
listOrders.docs = listOrders.docs.map((order) => {
order.orderCustomerCount = 1
/*
NOTE: This line is important because if you don't return
anything from this function, then your array will have an
undefined item in it.
*/
return order;
})