Обновить запись из forEach, если найдено

user88432 спросил: 12 мая 2018 в 04:35 в: javascript

В настоящее время я делаю это, он находит соответствующий Id между линией сообщений и линейкой продуктов, если найден, а затем добавляет статус.

var order = {
  "Products": [
   {"id": 123, "Status": []},
   {"id": 463, "Status": []},
  ]
}var message = {
  "lines": [
   {"id": 535},
   {"id": 463},
  ]
}const updateStatus = function(order, message, name) {
    var products = order.Products;
    message.lines.forEach((messageLine) => {
        products.forEach((item) => {
          if (products.Id == messageLine.Id) {
              item.Status.push({"Name": name});
          }
        });
    });    console.log(order)
}updateStatus(order, message, "Done");

Я не конечно, если это плохая практика, есть ли лучший способ?

Пример: http://jsfiddle.net/nv1cukw8/20/

2 ответа

bambam ответил: 12 мая 2018 в 05:04

Я бы использовал some(), чтобы проверить, существует ли запись с тем же идентификатором. Это остановится в первом матче, и у нас нет forEach в forEach. Кроме того, поскольку вы хотите обновить содержимое массива порядка (Status), я бы использовал это как основной цикл. Если messages.lines содержит миллионы строк и у вас есть только один Продукт, вы можете сэкономить некоторое время.

order.Products.forEach(product => {
    if (message.lines.some(({id}) => id === product.id)) {
        product.Status.push('whatever');
    }
});

console.log(order.Products)
<script>
var order = {
    "Products": [
        {"id": 123, "Status": []},
        {"id": 463, "Status": []},
    ]
}

var message = {
    "lines": [
        {"id": 535},
        {"id": 463},
    ]
}
</script>
user88432 ответил: 12 мая 2018 в 05:15
Это отлично работает, спасибо. Что вызвало из моего примера, что добавление дважды статуса?
karran ответил: 12 мая 2018 в 06:02

Я бы сделал что-то вроде этого: я изменил push-строку, потому что push возвращает индекс, который был нажат. Но я не знаю, было ли это то, что вам нужно.

products.filter(
  product => message.lines.filter(
    messageLine => 
      product.id == messageLine.id
  ).length > 0
).forEach(
  item => item.Status.push({'Name': name})
)