我想知道是否有一种方法可以使用换能器来展平列表并过滤唯一值?
通过链接,这很容易:
import {uniq, flattenDeep} from 'lodash';|
const arr = [1, 2, [2, 3], [1, [4, 5]]];
uniq(flattendDeep(arr)); // -> [1, 2, 3, 4, 5]Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.core.min.js"></script>Run Code Online (Sandbox Code Playgroud)
但是这里我们在列表上循环了两次(深度层+n)。不理想。
我想要实现的是在这种情况下使用换能器。我已经阅读了关于它的 Ramda 文档https://ramdajs.com/docs/#transduce,但我仍然找不到正确编写它的方法。
目前,我使用了一个带有递归函数的 reduce 函数:
import {isArray} from 'lodash';
const arr = [1, 2, [2, 3], [1, [4, 5]]];
const flattenDeepUniq = (p, c) => {
if (isArray(c)) {
c.forEach(o => p = flattenDeepUniq(p, o));
}
else {
p = !p.includes(c) ? [...p, c] : p;
}
return p; …Run Code Online (Sandbox Code Playgroud)