Как изменить значение ключа на основе сравнения массива объектов в jQuery? - PullRequest
2 голосов
/ 08 апреля 2020

У меня есть два массива в jQuery, как показано ниже.

var arr1 = [{A: "t1"},{A: "t3"}];

var arr2 = [{A: "t1",B:""},{A: "t2",B:""},{A: "t3",B:""},{A: "t4",B:""},{A: "t5",B:""},{A: "t6",B:""}];

var arr3 = []; //Only for output

Теперь вывод в arr3 должен быть:

  • все значения из arr2
  • клавиша 'B' должна быть Да , если клавиша 'A' существует в arr1
  • клавиша 'B' должна быть Нет , если клавиша 'A' не не существует в arr1

Итак, вывод, который я хочу в arr3, должен быть:

arr3 = [{A: "t1",B:"Yes"},{A: "t2",B:"No"},{A: "t3",B:"Yes"},{A: "t4",B:"No"},{A: "t5",B:"No"},{A: "t6",B:"No"}];

Это то, что я пробовал до сих пор

var arr1 = [{A: "t1"},{A: "t3"}];
var arr2 = [{A: "t1",B:""},{A: "t2",B:""},{A: "t3",B:""},{A: "t4",B:""},{A: "t5",B:""},{A: "t6",B:""}];
var arr3 = []; //Only for output

arr1.forEach(function(x) {
  arr2.forEach(function(y) {
    if (x.A == y.A) {
      arr3.push({
        A: x.A,
        B: "Yes"
      });
    } else {
      arr3.push({
        A: x.A,
        B: "No"
      });
    }
  });
});

console.log(arr3);
//Output
0: {A: "t1", B: "Yes"}
1: {A: "t1", B: "No"}
2: {A: "t1", B: "No"}
3: {A: "t1", B: "No"}
4: {A: "t1", B: "No"}
5: {A: "t1", B: "No"}
6: {A: "t3", B: "No"}
7: {A: "t3", B: "No"}
8: {A: "t3", B: "Yes"}
9: {A: "t3", B: "No"}
10: {A: "t3", B: "No"}
11: {A: "t3", B: "No"}

Проблема здесь в том, что он повторяется для каждого элемента в arr1, и количество удваивается. Я знаю, что он должен разрываться где-то между if и else, чтобы он не повторялся.

Я тоже пробовал проверять ссылки ниже, но не смог получить большую помощь.

filter массив объектов на основе отдельных ключей объектов, значения

js - Как изменить значение одного ключа на основе значения другого ключа в массиве объектов

Сравнение объектов по ключам

сравнение массивов объектов

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Используйте карту и найдите, если массивы не огромные.

Сохраняет уменьшение и pu sh

var arr1 = [{ A: "t1" }, { A: "t3" }];
var arr2 = [{ A: "t1", B: ""}, { A: "t2", B: "" }, { A: "t3", B: "" }, { A: "t4", B: "" }, { A: "t5", B: "" }, { A: "t6", B: "" }];
var arr3 = arr2.map(
  item2 => ({
    A: item2.A,
    B: arr1.find(item1 => item1.A === item2.A) ? 'Yes' : 'No'
  }));

console.log(arr3);
1 голос
/ 08 апреля 2020

Вы можете создать массив значений A в arr1, используя Array.reduce(), затем используйте Array.includes, чтобы проверить, каждое из значений A в arr2 присутствует в этом массиве, используя его, чтобы решить, следует ли установить B в Yes или No:

var arr1 = [{ A: "t1" }, { A: "t3" }];
var arr2 = [{ A: "t1", B: ""}, { A: "t2", B: "" }, { A: "t3", B: "" }, { A: "t4", B: "" }, { A: "t5", B: "" }, { A: "t6", B: "" }];
var arr3 = []; //Only for output

var arr1values = arr1.reduce((c, v) => c.concat([v.A]), []);

arr2.forEach(function(y) {
  arr3.push({
    A: y.A,
    B: arr1values.includes(y.A) ? 'Yes' : 'No'
  });
});

console.log(arr3);
...