JavaScript—以下执行的复杂性(forEach vs forEach indexOf)

JavaScript—以下执行的复杂性(forEach vs forEach indexOf),javascript,foreach,time-complexity,Javascript,Foreach,Time Complexity,问题陈述:-arr1是一个值为3、4和5的有序数组。在下面显示的列表中,属性“c”与数组元素属性“c”匹配的所有对象都应使用arr1处找到的索引的索引+1进行更新 我有两种不同的方法来实现相同的目标,哪一种时间复杂度更好,应该选择哪一种 var arr1=[3,4,5]; var list=[{a:1,b:2,c:3},{a:1,b:2,c:3},{a:2,b:3,c:5},{a:3,b:4,c:4}]; 输出:[{a:1,b:2,c:1},{a:1,b:2,c:1},{a:2,b:3,c:3}

问题陈述:-arr1是一个值为3、4和5的有序数组。在下面显示的列表中,属性“c”与数组元素属性“c”匹配的所有对象都应使用arr1处找到的索引的索引+1进行更新

我有两种不同的方法来实现相同的目标,哪一种时间复杂度更好,应该选择哪一种

var arr1=[3,4,5];
var list=[{a:1,b:2,c:3},{a:1,b:2,c:3},{a:2,b:3,c:5},{a:3,b:4,c:4}];
输出:[{a:1,b:2,c:1},{a:1,b:2,c:1},{a:2,b:3,c:3},{a:3,b:4,c:3}];
1:查找索引,然后更新索引:

list.forEach((obj)=>{
var i=arr1.indexOf(对象c);
如果(i>-1){
目标c=i+1;
}
});
  • 使用两个forEach循环
  • arr1.forEach((id,index)=>{
    list.forEach((obj)=>{
    如果(对象c==id){
    对象c=指数+1;
    }
    })
    });
    
    哪种写作方式更好?为什么

    您可以使用单个循环预先获取一个包含值和索引的值

    另一个循环用于
    list
    的所有元素,其中
    c
    会在必要时得到更新


    Map
    的一个实例是一个数据结构,用于与快速访问值保持键值关系O(1)

    var数组=[3,4,5],
    列表=[{a:1,b:2,c:3},{a:1,b:2,c:3},{a:2,b:3,c:5},{a:3,b:4,c:4}],
    值=新地图;
    array.forEach(Map.prototype.set,值);
    list.forEach(o=>{
    如果(values.has(o.c))o.c=values.get(o.c)+1;
    });
    
    控制台日志(列表)很抱歉问题中的错误-#2。m、 forEach是列表。forEach他们都是一样的。调用
    .indexOf()
    将遍历
    arr1
    ,因此在这两种情况下,时间复杂度都是乘积
    arr1.length*list.length
    。第二种方法的问题是,在找到与indexOf不同的匹配项后,它将访问每个索引。无论哪种方法,复杂度都是
    O(m*n)
    。嗯,
    O(m*n)
    O(n*m)
    但是乘法的顺序并不重要。