Javascript 比较字符串数组和具有字符串属性的数组对象的最佳方法?
我有一个对象数组,在这些对象中有一个Javascript 比较字符串数组和具有字符串属性的数组对象的最佳方法?,javascript,arrays,performance,properties,nested-loops,Javascript,Arrays,Performance,Properties,Nested Loops,我有一个对象数组,在这些对象中有一个name属性 const objArr=[{name:“Avram”},{name:“Andy”}] 我正在从包含名称的外部源收集字符串数组 const strArr=[“Avram”、“Andy”、“Brandon”] 如果strArr包含的字符串在objArr中的对象上不作为属性name存在,我需要创建一个新对象并将其推送到objArr 例如:objArr.push({name:“Brandon”}) 显然,我可以使用嵌套循环,但如果可能的话,我希望避免这
name
属性
const objArr=[{name:“Avram”},{name:“Andy”}]代码>
我正在从包含名称的外部源收集字符串数组
const strArr=[“Avram”、“Andy”、“Brandon”]代码>
如果strArr
包含的字符串在objArr
中的对象上不作为属性name
存在,我需要创建一个新对象并将其推送到objArr
例如:objArr.push({name:“Brandon”})代码>
显然,我可以使用嵌套循环,但如果可能的话,我希望避免这种情况。以编程方式执行此操作的最佳方法是什么
const objArr=[{name:“Avram”},{name:“Andy”}];
const strArr=[“Avram”、“Andy”、“Brandon”];
const names=objArr.map(x=>x.name);
strArr.forEach(str=>{
如果(!name.includes(str)){
objArr.push({name:str});
}
});
控制台日志(objArr)代码>像这样
const objArr=[{name:“Avram”},{name:“Andy”}];
const strArr=[“Avram”、“Andy”、“Brandon”];
const names=objArr.map(x=>x.name);
strArr.forEach(str=>{
如果(!name.includes(str)){
objArr.push({name:str});
}
});
控制台日志(objArr)代码>
函数fillMissing(arr,names){
names.forEach(name=>{//names中的每个名称
if(arr.every(obj=>obj.name!==name)){//如果数组arr中的每个对象obj的名称与此名称不同(此名称在arr中不存在)
arr.push({name});//然后将具有该名称的对象添加到arr
}
});
}
const objArr=[{name:“Avram”},{name:“Andy”}];
const strArr=[“Avram”、“Andy”、“Brandon”];
填充缺失(objArr、strArr);
控制台日志(objArr)代码>
函数fillMissing(arr,names){
names.forEach(name=>{//names中的每个名称
if(arr.every(obj=>obj.name!==name)){//如果数组arr中的每个对象obj的名称与此名称不同(此名称在arr中不存在)
arr.push({name});//然后将具有该名称的对象添加到arr
}
});
}
const objArr=[{name:“Avram”},{name:“Andy”}];
const strArr=[“Avram”、“Andy”、“Brandon”];
填充缺失(objArr、strArr);
控制台日志(objArr)代码>将
objArr
映射到与strArr
相同的结构。然后concat
2个数组。通过Set
运行它以删除重复项,然后重新map
以更正对象数组
const objArr=[{name:“Avram”},{name:“Andy”},{name:“John”}];
const strArr=[“Avram”、“Andy”、“Brandon”];
const res=Array.from(新集合(objArr.map(i=>i.name).concat(strArr))).map(i=>({name:i}))
控制台日志(res)代码>将
objArr
映射到与strArr
相同的结构。然后concat
2个数组。通过Set
运行它以删除重复项,然后重新map
以更正对象数组
const objArr=[{name:“Avram”},{name:“Andy”},{name:“John”}];
const strArr=[“Avram”、“Andy”、“Brandon”];
const res=Array.from(新集合(objArr.map(i=>i.name).concat(strArr))).map(i=>({name:i}))
控制台日志(res)代码>
const objArr=[{name:“Avram”},{name:“Andy”}];
const strArr=[“Avram”、“Andy”、“Brandon”];
const objNamesArr=objArr.map((obj)=>obj.name)
strArr.forEach((ele)=>objNamesArr.indexOf(ele)=-1&&objArr.push({name:ele}))
console.log('objArr',objArr);
console.log('strArr',strArr)代码>
const objArr=[{name:“Avram”},{name:“Andy”}];
const strArr=[“Avram”、“Andy”、“Brandon”];
const objNamesArr=objArr.map((obj)=>obj.name)
strArr.forEach((ele)=>objNamesArr.indexOf(ele)=-1&&objArr.push({name:ele}))
console.log('objArr',objArr);
console.log('strArr',strArr)代码>到目前为止,您拥有的最佳解决方案是什么?我可以想出一个解决方案,包括映射、排序(两次),然后是O(n)来比较两个列表。编辑:或者只是使用一个集合,让哈希处理它?节省排序。到目前为止,您最好的解决方案是什么?我可以想出一个解决方案,包括映射、排序(两次),然后是O(n)来比较两个列表。编辑:或者只是使用一个集合,让哈希处理它?保存排序。