Как сравнить два массива объектов и исправить одинаковые значения ключей? - PullRequest
0 голосов
/ 24 января 2020

Я искал, но не нашел именно того трюка, который мне нужен.

Я пытаюсь сравнить 2 массива объектов с одинаковыми ключами и обновить arr1, если значения в arr2 отличаются. Здесь - кодовая ручка, с которой можно играть.

let arr1 = [{val1: "dog", val2: "friendly"},{val1: "cat", val2: "fluffy"}]

let arr2 = [{val1: "cat", val2: "evil"},{val1: "mouse", val2: "tiny"},{val1: "hippo", val2: "big"}]

Ожидаемым результатом функции должна быть корректировка объекта, включая val1: "cat" в arr1:

 {val1: "cat", val2: "fluffy"} ----->  {val1: "cat", val2: "evil"}

и обновленный arr1 должен возвращаться так:

{val1: "dog", val2: "friendly"}, { val1: "cat", val2: "evil"}

Трюк в том, что код также должен работать в обоих направлениях. Так, например, если в arr1 есть {val1: "big", val2: "puma"}, он изменится на {val1: "big", val2: "hippo"}, заменив "puma", поскольку значение "big" связан с "гиппопотамом" в arr2.

Есть идеи, как этого добиться? Спасибо!

Ответы [ 2 ]

1 голос
/ 24 января 2020

Попробуйте функцию ниже - это удовлетворит обе стороны для arr1

function validateArray() {
        arr2.forEach(function(arr2Element) {
            arr1.forEach(function(arr1Element) {
                if (arr2Element.val1 === arr1Element.val1) {
                    arr1Element.val2 = arr2Element.val2;
                } else if (arr2Element.val2 === arr1Element.val1) {
                    arr1Element.val2 = arr2Element.val1;
                }
            });
        });
        console.log(arr1);
    }
0 голосов
/ 24 января 2020

L oop через arr2 пунктов. Для каждого элемента l oop arr1 для элемента с таким же значением val1, если он найден: установите его значение равным значению элемента arr2.

let arr1 = [
    {
    val1: "dog",
    val2: "friendly"
  },
  {
    val1: "cat",
    val2: "fluffy"
  }
];

let arr2 = [{
  val1: "cat",
  val2: "evil"
},

{
  val1: "mouse",
  val2: "tiny"
},

{
  val1: "hippo",
  val2: "big"
}
];

function validate() {
  arr2.forEach(function(v2) {
     arr1.forEach(function(v, idx) {
      if (v2.val1 == v.val1) {
        console.log('Change', v.val2, 'to', v2.val2);
        arr1[idx].val2 = v2.val2;
      }
    });
  });
}
<button id="validate" onclick="validate()">
Validate
</button>

Для больших массивов это имеет некоторые издержки, поэтому вы можете использовать другую структуру для arr1 (например, использовать val1 в качестве ключа), что сделает его гораздо проще, я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...