Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我需要将数组2中的值插入到数组1中,如果它们基于其他两个元素匹配_Javascript_Arrays - Fatal编程技术网

Javascript 我需要将数组2中的值插入到数组1中,如果它们基于其他两个元素匹配

Javascript 我需要将数组2中的值插入到数组1中,如果它们基于其他两个元素匹配,javascript,arrays,Javascript,Arrays,我知道以前有人问过这类问题,因为我正处于一个绊脚石,如果可能的话,我想把它完成,我需要问一下。我有两个阵列: let arr1 = [{ "Last_Name": "Smith"), "First_Name": "John, "MI": "I", "Fore_Name": ""), "Initials: "" }, "Last_Name": "Doe"), "First_Name": "Mary, "MI": "A", "Fore_Name": "Mary A),

我知道以前有人问过这类问题,因为我正处于一个绊脚石,如果可能的话,我想把它完成,我需要问一下。我有两个阵列:

let arr1 = [{
  "Last_Name": "Smith"),
  "First_Name": "John,
  "MI": "I",
  "Fore_Name": ""),
  "Initials: ""
}, "Last_Name": "Doe"),
  "First_Name": "Mary,
  "MI": "A",
  "Fore_Name": "Mary A),
  "Initials: "MA"
},"Last_Name": "Johnson"),
  "First_Name": "Bob",
  "MI": "B",
  "Fore_Name": ""),
  "Initials: ""
}]


let arr2 = [{
  "Last_Name": "Smith"),
  "First_Name": "John,
  "MI": "I",
  "Fore_Name": "John I"),
  "Initials: "JI"
}, "Last_Name": "Doe"),
  "First_Name": "Mary,
  "MI": "A",
  "Fore_Name": "Mary A),
  "Initials: "MA"
},"Last_Name": "Johnson"),
  "First_Name": "Bob",
  "MI": "B",
  "Fore_Name": "Bob B"),
  "Initials: "BB"
}
}]
我想用array2中的数据更新array1的
ForeName
和Initials字段,如果它们是空的,
array1[“Last\u Name”]=array2[“Last\u Name”]
array1[“first\u Name”]的第一个字符。切片(0,1)=array2[“Initials”]。切片(0,1)
。 如果array1的
名字不为空,则跳过它

我看过

我认为这很接近。我明白

arra1 = arra1.map(item => {
  let item2 = arra2.find(i2 => i2.Last_Name === item.Last_Name);
 // not sure what to do here return item2 ? { ...item, ...item2 } : item;
});
并且不确定如何将第一个_名称的第一个字符与Array2首字母的第一个字符匹配

绘制地图时跟踪索引:

arra1 = arra1.map( (item,index) => {
// if !(item["Fore_Name"])  
// AND item["Last_Name"] === arra2[index]["Last_Name"]
// AND your slice testing (please with ===)
// THEN item["Fore_Name"] = arra2[index]["Fore_Name"]
//  item["Initials"] = arra2[index]["Initials"]
return item
});

map
回调的返回值是将添加到新数组中的项。因此,对于您的示例,以下内容应该有效。注意,您必须为未定义和空值等添加必要的检查

arr1 = arr1.map(item => {
  // Return fast is Fore_Name already exists in arr1
  if (item.Fore_Name) return item;
  let item2 = arr2.find(i2 =>
    i2.Last_Name === item.Last_Name
    && item.First_Name.charAt(0) === i2.Initials.charAt(0));
  if (item2) {
    item.Fore_Name = item2.Fore_Name;
    item.Initials = item2.Initials;
  }
  return item;
});

在比较数组1和数组2中的对象时,可以方便地定义ObjectsReequal函数

我们可以使用它从数组2中找到相关的对象

请注意,这将导致大型数组的性能较差(因为我们这里有n平方行为)。如果您的数组非常大(可能有数千项),则最好从Array2创建一个映射,并使用它来分配值

let arr1=[{“姓”:“史密斯”,“名”:“约翰”,“密苏里州”:“我”,“姓”:“我”,“姓”:“首字母”:“},{“姓”:“Doe”,“姓”:“玛丽”,“密苏里州”:“A”,“姓”:“玛丽A”,“首字母”:“马”},{“姓”:“约翰逊”,“姓”:“鲍勃”,“密苏里州”:“B”,“姓”:“玛丽”,“首字母”:“}]
设arr2=[{“姓氏”:“史密斯”,“姓”:“约翰”,“密苏里”:“我”,“姓”:“约翰一”,“缩写”:“吉”},{“姓氏”:“Doe”,“姓”:“玛丽”,“密苏里”:“A”,“姓”:“玛丽A”,“缩写”:“马”},{“姓氏”:“约翰逊”,“姓”:“鲍勃”,“密苏里”:“B”,“姓”:“鲍勃”,“缩写”:“BB;
函数对象REEQUAL(arr1Obj,arr2Obj){
返回((arr1Obj.Last_Name==arr2Obj.Last_Name)&&(arr1Obj.First_Name.substr(0,1)==arr2Obj.Initials.substr(0,1));
}
让result=arr1.map(arr1Obj=>{
如果(!arr1Obj.Fore_Name&!arr1Obj.Initials){
让arr2Match=arr2.find(arr2Obj=>objectsAreEqual(arr1Obj,arr2Obj));
如果(arr2Match){
arr1Obj.Fore_Name=arr2Match.Fore_Name;
arr1Obj.Initials=arr2Match.Initials;
}
}
返回arr1Obj;
});

日志(“结果:”,结果)通过跟踪map函数中的索引,可以从第二个数组中找到元素。如果条件不匹配,则返回迭代项。如果它们匹配,则返回一个已修改的项

const result=arr1.map((项目,索引)=>{
const itemTwo=arr2[index];
如果(item.Fore_Name!==“”)返回项目;
如果(
!(
item.Last_Name===itemTwo.Last_Name&&
item.First_Name[0]==itemTwo.首字母[0]
)
) 
退货项目;
item.Fore_Name=itemTwo.Fore_Name;
item.Initials=itemtoo.Initials;
退货项目;
});

这是一个。

请添加有效数据和所需结果。
arr1 = arr1.map(item => {
  // Return fast is Fore_Name already exists in arr1
  if (item.Fore_Name) return item;
  let item2 = arr2.find(i2 =>
    i2.Last_Name === item.Last_Name
    && item.First_Name.charAt(0) === i2.Initials.charAt(0));
  if (item2) {
    item.Fore_Name = item2.Fore_Name;
    item.Initials = item2.Initials;
  }
  return item;
});