Как присвоить значение новому атрибуту объектам массива json в java-скрипте?

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