将两个数组与对象权益进行比较

Posted

技术标签:

【中文标题】将两个数组与对象权益进行比较【英文标题】: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"
  
];

【问题讨论】:

你想要输出什么?你能描述更多吗? 更新了我的问题 【参考方案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";
    
  );
);

【讨论】:

以上是关于将两个数组与对象权益进行比较的主要内容,如果未能解决你的问题,请参考以下文章

将 NSManagedObject 数组与另一个“对象”类型 Swift 2 的数组进行比较

Vuejs2 - 如何将两个数组中的元素与计算属性进行比较?

比较java中数组的元素

通过使用 Map Filter 与对象数组进行比较来返回字段

按属性将对象数组与另一个对象的键进行比较

比较对象数组,最佳方式