ramdajs递归一个嵌套的JSON

时间:2017-09-29 10:34:22

标签: javascript ramda.js

const arr = [1,2,[3,4,5,[6,7,[8,9],10]]];

让我们说我们有一个像上面这样的嵌套数组。是否有特定的深度递归方法?

而不是在函数中调用相同的函数或迭代循环;是否有任何deepMap函数迭代所有嵌套项?

完全遍历对象树。

R.deepMap(function(e){
   console.log(e)
});
//1,2,3,4,5,6,7,8,9,10

4 个答案:

答案 0 :(得分:2)

通常更容易将其分解为较小的功能,在这种情况下,展平深度嵌套的数组,然后在其上进行映射。

const deepMap = f => R.pipe(flatten, map(f))

deepMap(R.inc)(arr)
// -> [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

答案 1 :(得分:1)

Ramda没有内置这样的东西。 (我不太清楚我们如何键入输入。)但是编写自己的输入很容易:

const arr = [1,2,[3,4,5,[6,7,[8,9],10]]]

const deepMap = (fn, xs) => map(x => is(Array, x) ? deepMap(fn, x) : fn(x), xs)

deepMap(n => n * n, arr) //=> [1, 4, [9, 16, 25, [36, 49, [64, 81], 100]]]

您可以在 Ramda REPL

上看到这一点

答案 2 :(得分:0)

你可以做到



const arr = [1,2,[3,4,5,[6,7,[8,9],10]]];

function flatten(arr){
    return arr.reduce((a, b) => {
        if(b instanceof Array)
            a = a.concat(flatten(b));
        else
            a.push(b);
        return a;
    }, []);
}

console.log(flatten(arr));




答案 3 :(得分:0)

您可以使用R.flatten方法在一个数组中展平嵌套数组。

然后使用R.forEach方法在所有新数组项上应用函数。

<强> 实施例

const arr = [1,2,[3,4,5,[6,7,[8,9],10]]];

R.forEach(function (e) {
  console.log(e);
}, R.flatten(arr))
<script src="//cdn.jsdelivr.net/ramda/latest/ramda.min.js"></script>