Как объединить ответ сокета в массиве? - PullRequest
1 голос
/ 31 октября 2019

У меня есть сокет, который возвращает мне это:

Образец отдельных обновлений (синяя линия):

{
  "listBeans": [
    {
      "fruit": {
        "value": "apple"
      },
      "currentQuantity": {
        "value": "1"
      },
      "type": {
        "value": "B"
      },
      "price": {
        "value": "3.1"
      }
    }
  ]
}

Образец истории (красная линия):

{
  "listBeans": [
    {
      "fruit": {
        "value": "apple"
      },
      "currentQuantity": {
        "value": "1"
      },
      "type": {
        "value": "A"
      },
      "price": {
        "value": "3.1"
      }
    },
    {
      "fruit": {
        "value": "banana"
      },
      "currentQuantity": {
        "value": "4"
      },
      "type": {
        "value": "A"
      },
      "price": {
        "value": "7.1"
      }
    }
  ]
}

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

Факты: первыйответом моего сокета всегда будет история фруктов, после этого последующими ответами будут обновления фруктов.

красная линия означает историю, а синие линии означают отдельные обновления socket

разница невозможна, если обновление или история

первая красная строка: история типа A

вторая красная линия: история типаB

Это то, что я получил слишком далеко:

if (response['listBeans'].length > 1) { // only works if my history returns more than one 
  this.myList = 
  this.myList.concat(this.wsFormatter.formatResponse(response['listBeans'])); // will just format my response
  this.myList = this.myList.filter(f => f.currentQuantity !== '0'); // i want to display only fruits with quantity bigger than 1
  this.myList = this.formatList(this.myList); // this function is important, they will add some keys to my object via Rest API, this function only need to be called when is a new fruit in my list
} else {
for (const item of this.listPositions) {
    if (response['listBeans'][0].fruit.value === item.fruit) { // here i verify i the response is the same as my list
        item.price = response['listBeans'][0].price.value; // change the value of price in my list
        item.currentQuantity = response['listBeans'][0].currentQuantity.value; // change the value of currentQuantity in my list
     }
   }
 }

Как я могу объединить новые ответы в моем списке (массив)? мой код работает, только если моя история больше единицы, если мой ответ на историю равен единице, мой код не работает

Это то, что я хочу:

enter image description here

1 Ответ

1 голос
/ 31 октября 2019

Используйте findIndex () , чтобы найти, существует ли элемент в history. Если существует, обновите элемент, иначе добавьте элемент.

let history = { "listBeans": [{ "fruit": { "value": "apple" }, "currentQuantity": { "value": "1" }, "type": { "value": "A" }, "price": { "value": "3.1" } }, { "fruit": { "value": "banana" }, "currentQuantity": { "value": "4" }, "type": { "value": "A" }, "price": { "value": "7.1" } } ] };

let update = { "listBeans": [{ "fruit": { "value": "apple" }, "currentQuantity": { "value": "1" }, "type": { "value": "B" }, "price": { "value": "3.1" } }] };

function updateData(history, update) {
  update.listBeans.forEach(obj => {
    let index = history.listBeans.findIndex(item => item.fruit.value === obj.fruit.value);

    // Update item if already exists.
    if (index != -1) {
      history.listBeans[index] = { ...obj };
    } else {
      // Append item.
      history.listBeans.push({ ...obj });
    }
  });

  return history;
}

console.log(updateData(history, update));

Разница невозможна, если это обновление или история.

В этом случае, если у вас есть глобальныйпеременная history, вы можете сделать что-то, как показано ниже. Обязательно инициализируйте history пустым массивом.

// Incoming socket data.
let current = response; 

// Update history.
this.history = updateData(this.history, current);
...