Javascript 检查对象数组中的值是否不同的最快方法
我有两个数组:Javascript 检查对象数组中的值是否不同的最快方法,javascript,typescript,Javascript,Typescript,我有两个数组:model和workModel,每个数组都包含一个值数组。在发送POST请求之前,我想检查哪些值已更新 dataToUpdate(工作模型:数据[]){ let数据:数据[]; this.model.forEach(m=>{ m、 values.forEach(val=>{ workModel.forEach(wm=>{ wm.values.forEach(wval=>{ 如果(val.colId!=wval.colId){ 数据推送(wm); } }); }); }); });
model
和workModel
,每个数组都包含一个值
数组。在发送POST
请求之前,我想检查哪些值已更新
dataToUpdate(工作模型:数据[]){
let数据:数据[];
this.model.forEach(m=>{
m、 values.forEach(val=>{
workModel.forEach(wm=>{
wm.values.forEach(wval=>{
如果(val.colId!=wval.colId){
数据推送(wm);
}
});
});
});
});
返回数据;
}
对数据做一些假设,您可以这样做。如果不起作用,请告诉我
基本上,将两个数组平面映射为单个值数组,然后对其进行过滤和重复数据消除
function dataToUpdate(workModel: Data[]) {
return workModel
.flatMap((wm) => wm.values)
.concat(this.model.flatMap((m) => m.values))
.filter((val, i, arr) => {
return arr.findIndex((v) => v.colId === val.colId) === i;
});
}
您也可以这样做,这对于超大阵列来说速度更快
function dataToUpdate(workModel: Data[]) {
const flat = workModel.flatMap((wm) => wm.values).concat(this.model.flatMap((m) => m.values));
const uniqIds = new Set(flat.map((col) => col.colId));
return flat.filter(uniqIds.delete)
}
你能给我一个你的数据的样本吗?如果我们必须对嵌套循环中对象的形状进行反向工程,很难给出一个好的答案。这将在
O(n^2)
时间内运行-我怀疑它比OP快得多。noob问题,map和flatMap是否相同,flatMap给出错误“属性”“flatMap”在类型“any[]”上不存在。ts(2339)'我已经添加了数组示例尝试在tsconfig中将“esnext”添加到您的lib数组中让我知道这是否有帮助(如果您在web上这样做,还可以为旧浏览器添加polyfill)。您可以在这里阅读更多有关flatMap的信息@user122222 TS可能未配置为识别新的JS功能。是相当新的-后ES6。这是一个map
操作,加上“展平结果,例如,你有[1,2,3]
和.map(x=>[x*2])
将给你[2],[4],[6]
而.flatMap(x=>[x*2])
将使数组保持在一个级别-[2,4,6]
。没问题,关于今后避免for
循环的一些稍微相关的建议通常是所有基于数组的算法实际上只能使用Array.prototype.reduce和flatMap、concat、map、filter来解决,因为使用reduce更容易。