首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Lodash递归遍历数组

使用Lodash递归遍历数组
EN

Stack Overflow用户
提问于 2015-06-16 20:14:57
回答 3查看 3.7K关注 0票数 0

我希望使用下划线来迭代每个项目,并在每个水果名称的末尾追加一个句点,并返回一个数组。但是可以有许多嵌套级别。

代码语言:javascript
运行
复制
`const` `NESTED =` `[
       {name: 'Apple', 
        items: [{
                 name: 'Orange', 
                 items: [{name: 'Banana'}]
              }]}, 
       {name: 'Pear'}]`

我的期末考试应该是这样的:

代码语言:javascript
运行
复制
`NESTED =` `[{ name: 'Apple.', items: [{name: 'Orange.', items: [{name: 'Banana.'}]}]}, { name: 'Pear.'}]`

里面可以有很多很多的东西。这就是我陷入困境的地方,我当前的下划线函数只能获得第一个级别,使用._map:

代码语言:javascript
运行
复制
let items = _.map(NESTED, function(item){
            return {
                // append the period here, but doesn't go deeper
            }
        });

做这件事的好方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-16 21:09:01

这对于您提供的示例数据应该有效。

代码语言:javascript
运行
复制
var pre = document.getElementById('out'),
    NESTED = [{
        name: 'Apple',
        items: [{
            name: 'Orange',
            items: [{
                name: 'Banana'
            }]
        }]
    }, {
        name: 'Pear'
    }];

function recurse(arr) {
    var res = arr.map(function (item) {
        return Object.keys(item).reduce(function (acc, key) {
            if (key === 'name') {
                acc[key] = item[key] + '.';
            } else if (key === 'items') {
                acc[key] = recurse(item[key]);
            }

            return acc;
        }, {});
    });

    return res;
}

pre.textContent = 'New\n\n';
pre.textContent += JSON.stringify(recurse(NESTED), null, 2) + '\n\n';
pre.textContent += 'Original\n\n';
pre.textContent += JSON.stringify(NESTED, null, 2);
代码语言:javascript
运行
复制
<pre id="out"></pre>

应该很容易将纯JS转换为下划线。

更新:直接转换为下划线

代码语言:javascript
运行
复制
var pre = document.getElementById('out'),
    NESTED = [{
        name: 'Apple',
        items: [{
            name: 'Orange',
            items: [{
                name: 'Banana'
            }]
        }]
    }, {
        name: 'Pear'
    }];

function recurse(arr) {
    var res = _.map(arr, function (item) {
        return _.reduce(_.keys(item), function (acc, key) {
            if (key === 'name') {
                acc[key] = item[key] + '.';
            } else if (key === 'items') {
                acc[key] = recurse(item[key]);
            }

            return acc;
        }, {});
    });

    return res;
}

pre.textContent = 'New\n\n';
pre.textContent += JSON.stringify(recurse(NESTED), null, 2) + '\n\n';
pre.textContent += 'Original\n\n';
pre.textContent += JSON.stringify(NESTED, null, 2);
代码语言:javascript
运行
复制
<script src="http://underscorejs.org/underscore-min.js"></script>
<pre id="out"></pre>

票数 0
EN

Stack Overflow用户

发布于 2015-06-16 20:25:10

只是一次快速的尝试

代码语言:javascript
运行
复制
var findMyChildren = function(this, parent){
    if(parent !== null){
        this[name] = child[name] + '.';
    }

    if(child[items] !== null){
        for(var i=0;i<child[items].length;i++){
            var child = this[items][i];
            findMyChildren(child, this);
        }
    }   
};
票数 0
EN

Stack Overflow用户

发布于 2015-06-16 20:51:11

答案已经在这里了,looping through arrays of arrays

代码语言:javascript
运行
复制
var printArray = function(arr) {
  if ( typeof(arr) == "object") {
    for (var i = 0; i < arr.length; i++) {
        printArray(arr[i]);
    }
  }
else document.write(arr);
}

printArray(parentArray);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30877296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档