【问题标题】:Recursively iterate through arrays with Lodash使用 Lodash 递归遍历数组
【发布时间】:2015-06-16 20:14:57
【问题描述】:

我想使用下划线遍历每个项目并在每个水果名称的末尾附加一个句点,然后返回一个数组。但是可以有许多嵌套级别。

`const` `NESTED =` `[
       {name: 'Apple', 
        items: [{
                 name: 'Orange', 
                 items: [{name: 'Banana'}]
              }]}, 
       {name: 'Pear'}]`

我的决赛应该是这样的:

`NESTED =` `[{ name: 'Apple.', items: [{name: 'Orange.', items: [{name: 'Banana.'}]}]}, { name: 'Pear.'}]`

里面可以有很多很多的项目。这就是我卡住的地方,我当前的下划线函数只得到第一级,使用 ._map:

let items = _.map(NESTED, function(item){
            return {
                // append the period here, but doesn't go deeper
            }
        });

有什么好的方法可以做到这一点?

【问题讨论】:

  • 是否必须创建新的数据数组或者可以修改原始数据?
  • 返回一个新的将是理想的

标签: javascript lodash


【解决方案1】:

这应该适用于您提供的示例数据。

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);
<pre id="out"></pre>

应该很容易将纯JS翻译成下划线。

更新:直接转换为下划线

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);
<script src="http://underscorejs.org/underscore-min.js"></script>
<pre id="out"></pre>

【讨论】:

    【解决方案2】:

    只是一个快速的尝试

    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);
            }
        }   
    };
    

    【讨论】:

      【解决方案3】:

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

      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-04
        • 2020-06-02
        • 2012-07-17
        • 2010-12-08
        • 1970-01-01
        • 2021-01-18
        • 1970-01-01
        相关资源
        最近更新 更多