gpt4 book ai didi

JavaScript:在reduce方法中引用剩余的数组(折叠)?

转载 作者:行者123 更新时间:2023-12-01 02:44:01 28 4
gpt4 key购买 nike

我想测试数组是否仅包含唯一元素,我的解决方案如下:

function uniqueElements(a) {
var r = true;
while (a) {
var [el, a] = [a.slice(0,1), a.slice(1)];
r &= !a.includes(el);
};
return !!r;
}

这个方法有效。然而,由于我采用了更实用的风格,并且折叠非常棒,所以我想实现一个看起来像这样的函数:

function uniqueElements(a) {
var isUnique = (acc, el) => acc &= !remainingArray.includes(el);
return a.reduce(isUnique, true);
}

我不知道如何获取该 remainingArray 变量。有人知道如何得到它吗?这在 JS 中是否可能,如果不可能,该函数如何通过折叠来表达?

最佳答案

记住不要陷入思维模式。折叠很棒,但在 JavaScript 中,如果我们的结果可以在遍历整个数组之前计算出来,则无法提前停止折叠

换句话来说,下面的答案是什么? true还是false

uniqueElements ( [ 1 , 1 , 2 , 3 , ... thousands more items ] )
// => true or false ?

处理第二个1后,我们可以立即确定答案为false。无需继续折叠 23 或数组的其余部分,因为它们不会影响 false 结果

一个可能的解决方案是一个简单的递归过程

const isUnique = ([ x, ... xs ], set = new Set ()) =>
x === undefined
? true
: set.has (x)
? false // we already found a non-unique, stop recurring
: isUnique (xs, set.add (x))

console.log (isUnique ([]))
// true

console.log (isUnique ([ 1, 2, 3 ]))
// true

console.log (isUnique ([ 1, 1, 2, 3 ]))
// false

或者仍然保持纯函数式接口(interface)的堆栈安全解决方案 - 如果我不得不猜测,这可能比上面的程序快 10 倍,并且不公开私有(private) API

const isUnique = xs =>
{
const set = new Set ()
for (const x of xs)
if (set.has (x))
return false
else
set.add (x)
return true
}

console.log (isUnique ([]))
// true

console.log (isUnique ([ 1, 2, 3 ]))
// true

console.log (isUnique ([ 1, 1, 2, 3 ]))
// false

或者制定自己的解决方案 - 无论哪种方式,都不要陷入困境,认为只要接触可遍历的数据结构就需要使用折叠。

从更一般的意义上来说,您需要练习想象函数的流程是什么样的。我建议您在第一次掌握窍门时用铅笔和纸来玩编译器/评估器。最终你将能够在头脑中想象出简单的过程;然后随着时间的推移练习更复杂的 - 我这样说是因为如果你能看到在结果可以之后继续折叠看起来多么愚蠢,你可能不会达到折叠来完成这项任务被退回

就此而言,这就是为什么我使用 Set 来检查唯一性,而不是 .includes。集合可以进行二分搜索,而数组搜索是线性的——一旦您看到对于相当大的输入该过程会是什么样子,在数组中逐一查找您的项目似乎很愚蠢。只有当您设想流程时,您才能看到 Set 等替代数据结构如何显着降低函数的时间复杂度

关于JavaScript:在reduce方法中引用剩余的数组(折叠)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47383127/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com