Сравните два массива с эквити объекта - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть два типа для структур данных

   var dataA = [
  {
    "Employee Name": "Mr. X",
    id: "1"
  },
  {
    "Employee Name": "Mr. Y",
    id: "2"
  },
  {
    "Employee Name": "Mr. Z",
    id: "3"
  }
];

var dataB = [
  {
    id: "1",
    "Portfolio Lead": "A"
  },
  {
    id: "2",
    "Portfolio Lead": "B"
  },
  {
    id: "4",
    "Portfolio Lead": "D"
  }
];

Теперь я сравниваю значение id обоих массивов и добавляю свойство "Portfolio Lead" к dataA.

Ниже приведен код,

function mergeTwoArray() {
  dataA.forEach(row => {
    dataB.forEach(lead => {
      if (lead["id"] === row["id"]) {
        row["Portfolio Lead"] = lead["Portfolio Lead"];
      }
    });
  });
  console.log(dataA);
}

Проблема в том,

Когда id не совпадает, мне нужно добавить "Portfolio Lead" как #NA. Если я попытаюсь добавить оператор if, все объекты добавят "Portfolio Lead" как #NA.

Пожалуйста, скажите мне, что я делаю здесь неправильно.

stackBlitz link https://stackblitz.com/edit/typescript-nypqge?file=index.ts

Вывод должен быть

var dataA = [
  {
    "Employee Name": "Mr. X",
    id: "1",
    "Portfolio Lead": "A"
  },
  {
    "Employee Name": "Mr. Y",
    id: "2",
    "Portfolio Lead": "B"
  },
  {
    "Employee Name": "Mr. Z",
    id: "3",
    "Portfolio Lead": "#NA"
  }
];

Ответы [ 3 ]

0 голосов
/ 18 апреля 2020

Вы можете попробовать это:

function mergeTwoArray() {
  dataA.forEach(row => {
    let idxId = dataB.findIndex((lead) => lead["id"] == row["id"]);

    if (idxId >= 0) {
      row["Portfolio Lead"] = dataB[idxId]["Portfolio Lead"];
    } else {
      row["Portfolio Lead"] = "#NA";
    }
  });
  console.log(dataA);
}
0 голосов
/ 18 апреля 2020

Вы можете добавить оператор else if, как показано ниже -

else if(row["id"] > lead["id"]){
    row["Portfolio Lead"] = "#NA";
}

Когда вы помещаете row["Portfolio Lead"] = "#NA"; в else, блокируйте его обновление каждый раз, как для каждой итерации во внешнем l oop, внутреннем l oop выполняется длина dataB раз. И здесь я проверяю, обновляется ли внешний l oop id> внутренний l oop id, а затем обновляется.

, поэтому ваш код будет выглядеть так:

dataA.forEach(row => {
  dataB.forEach(lead => {
    if (lead["id"] === row["id"]) {
      row["Portfolio Lead"] = lead["Portfolio Lead"];
    } else if(row["id"] > lead["id"]){
      row["Portfolio Lead"] = "#NA";
    }
  });
});
0 голосов
/ 18 апреля 2020

Добавьте условие bool для проверки совпадения. Если этого не произошло, установите для вашего свойства объекта значение "#NA".

function mergeTwoArray() {
  dataA.forEach(row => {
    var rowMatches = false;
    dataB.forEach(lead => {
      if (lead["id"] === row["id"]) {
        rowMatches = true;
        row["Portfolio Lead"] = lead["Portfolio Lead"];
      }
    });
    if (!rowMatches) {
      row["Portfolio Lead"] = "#NA";
    }
  });
  console.log(dataA);
}
...