【问题标题】:Lodash filter need to get exact match, which has dynamic child nodeLodash过滤器需要得到完全匹配,它有动态的子节点
【发布时间】:2020-04-18 11:00:26
【问题描述】:

当尝试使用 Lodash 过滤具有动态子节点的数组时。我得到了二级子节点,但我需要过滤子节点,它可以动态可用。我能够达到第二级,但动态循环没有发生。您能否帮助使用 Lodash 循环和过滤数组中的确切子节点。请找到到目前为止完成的编码

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
var treeData = [{
                "id": 1,
                "title": "Test1",
                "type": [{
                    "name": "1.1",
                    "present": false
                }, {
                    "name": "1.2",
                    "present": true
                }, {
                    "name": "1.3",
                    "present": false
                }]
            }, {
                "id": 2,
                "title": "Test2",
                "type": [{
                    "name": "2.1",
                    "present": false
                }, {
                    "name": "2.2",
                    "present": true
                }, {
                    "name": "3.3",
                    "present": false
                }]
            }, {
                "id": 3,
                "title": "Test3",
                "type": [{
                    "name": "3.1",
                    "present": false,
                    "type": [{
                        "name": "3.1.1",
                        "present":false
                    }, {
                        "name": "3.1.2",
                        "present":true
                    }, {
                        "name": "3.1.3",
                        "present":false
                    }, ]
                }, {
                    "name": "3.2",
                    "present": true
                }, {
                    "name": "3.3",
                    "present": true
                }]
            }];

var result = _(treeData)
  .filter({
    type: [{ name: '3.3' }]
  })
  .map(({ type, ...o }) => ({
    ...o,
    type: _.filter(type, { name: '3.3' })
  }))
  .value();

console.log(result); 

在上面的示例中,我可以获取名称:3.3.. 但无法获取过滤器节点名称:“3.1.3”。任何人都可以请帮忙。提前致谢。

【问题讨论】:

    标签: javascript lodash


    【解决方案1】:

    一旦我编写了以下逻辑来查找嵌套对象中的任何节点。 这也适用于您的情况。

    var treeData = [{ "id": 1, "title": "Test1", "type": [{ "name": "1.1", "present": false }, { "name": "1.2", "present": true }, { "name": "1.3", "present": false }] }, { "id": 2, "title": "Test2", "type": [{ "name": "2.1", "present": false }, { "name": "2.2", "present": true }, { "name": "3.3", "present": false }] }, { "id": 3, "title": "Test3", "type": [{ "name": "3.1", "present": false, "type": [{ "name": "3.1.1", "present":false }, { "name": "3.1.2", "present":true }, { "name": "3.1.3", "present":false }, ] }, { "name": "3.2", "present": true }, { "name": "3.3", "present": true }] }];
    
    function findByName(data, name) {
    
        var object;
        data.some(function f(a) {
            if (a.name == name) {
                object = a;
                return true;
            }
    
            _.each(Object.keys(a), function (value, key) {
                // loops through json objects in waypath
                if (!_.isEmpty(object)) {
                    return false; // stop once we get the user
                }
                if (isNaN(value)) {
                    // only data with string keys need to iterate more
                    // when there is an array with elements
                    if (Array.isArray(a[value]) && a[value].length != 0) {
                        a[value].some(f); // recursion (Didn't use return because we are in loop)
                    } else if (!_.isEmpty(a[value])) {
                        // when there is an object within object
                        _.each(Object.keys(a[value]), function (val, key2) {
                            if (Array.isArray(a[value][val]) && a[value][val].length != 0) {
                                a[value][val].some(f); // recursion
                            }
                        });
                    }
                }
            });
        });
    
        return object;
    }
    
    console.log("Search 3.3 :: ", findByName(treeData, "3.3"));
    
    console.log("Search 3.1.3 :: ", findByName(treeData, "3.1.3"));
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"&gt;&lt;/script&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多