Javascript 如何降低此函数的对数成本
在工作中,我们现在正试图提高代码的性能。所以,要做到这一点,我们要避免函数的对数代价 如果在一个循环中有一个循环,那么与先用一个循环再用另一个循环来解决问题相比,成本更高。关于这一点,请查看维基百科链接 好的,我遇到的问题是这个对象数组和数组Javascript 如何降低此函数的对数成本,javascript,arrays,object,ecmascript-6,Javascript,Arrays,Object,Ecmascript 6,在工作中,我们现在正试图提高代码的性能。所以,要做到这一点,我们要避免函数的对数代价 如果在一个循环中有一个循环,那么与先用一个循环再用另一个循环来解决问题相比,成本更高。关于这一点,请查看维基百科链接 好的,我遇到的问题是这个对象数组和数组 const arr = [{ value1: [true, true], value2: [true, true], }, { value3: [true, true], value4: [true, false],
const arr = [{
value1: [true, true],
value2: [true, true],
}, {
value3: [true, true],
value4: [true, false],
}
]
我想知道是否有任何内部值是假的。在本例中,最后一个为false,因此函数hasError将向我显示true。如果我们将第二个对象的值4更改为true,它将返回false
这是我的方法,成本较高:
function hasError (a) {
return a.some(obj=> {
return Object.values(obj).some(arr => {
return arr.some(boolean => {
return boolean === false
})
})
})
}
有更便宜的解决方案吗?您可以为数组对象创建一个接口,用于跟踪假值的数量
insert
和update
方法将递增或递减计数器(对于false
值)。然后,hasrerror
方法只需询问false
值的数量是否大于0
当然,此解决方案包括一些开销,但它会使hasrerror
方法有O(1)个时间。如果值始终为真或假,则可以对项目进行设置,并使用大小
检查是否有两个值:
function hasError(a) {
return new Set(a.flatMap(Object.values).flat()).size == 2;
}
我认为你不太懂时间复杂性分析。您当前的实现不是对数的,而是线性的(相对于总数组项)。展开for循环也不会改变时间复杂度,它将保持线性。您只需迭代一次。仅仅因为有循环并不意味着你对任何一个项目重复了不止一次,你能举个例子吗?