Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Arrays_Object_Ecmascript 6 - Fatal编程技术网

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循环也不会改变时间复杂度,它将保持线性。您只需迭代一次。仅仅因为有循环并不意味着你对任何一个项目重复了不止一次,你能举个例子吗?