【问题标题】:Compare two array with object equity将两个数组与对象权益进行比较
【发布时间】:2020-07-31 14:08:51
【问题描述】:

我有两种类型的数据结构

   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 链接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"
  }
];

【问题讨论】:

  • 你想要输出什么?你能描述更多吗?
  • 更新了我的问题

标签: javascript arrays typescript for-loop object


【解决方案1】:

添加一个布尔条件来检查是否发生匹配。如果没有,则根据需要将您的对象属性设置为“#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);
}

【讨论】:

    【解决方案2】:

    你可以试试这个:

    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);
    }
    

    【讨论】:

      【解决方案3】:

      你可以像下面这样添加一个 else if 语句 -

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

      当您将row["Portfolio Lead"] = "#NA"; 放入 else 中时,每次都会阻止其更新,因为对于外循环中的每次迭代,内循环执行 dataB 次的长度。在这里我正在检查外部循环的 id > 内部循环的 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";
          }
        });
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-04
        • 1970-01-01
        • 2018-02-06
        • 1970-01-01
        • 2014-09-21
        相关资源
        最近更新 更多