Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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 检查对象数组中的值是否不同的最快方法_Javascript_Typescript - Fatal编程技术网

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更容易。