尝试使用Lodash返回深层嵌套对象

时间:2016-06-15 20:37:02

标签: javascript angularjs lodash

我无法在StackoverlFlow上找到解决方案,而且我已经在这个问题上工作了一段时间了。它有点困难所以请告诉我是否应提供更多信息。

我的问题: 我有一个Lands的JSON对象,每个陆地都有一个ID和一个与之关联的Blocks数组,块数组也有ID的块。

预览:

var Lands = [{
                'LandId':'123',
                'something1':'qwerty',
                'something2':'qwerty',
                'Blocks': [
                    {
                        'id':'456',
                        'LandId':'123'
                    },
                    {
                        'BlockId':'789',
                        'LandId':'123'
                    }
                ]
            },
            ...More Land Objects];

注意:数据的设置方式不是我想要的,但这是在不久前完成的,我必须立即处理我的工作。

我正在尝试编写一个lodash函数,它将获取我拥有的blockId并匹配它们并从Blocks返回landId。

所以最终结果将是从Blocks返回的LandId列表。

我使用的是这样的东西,它没有返回任何结果:

selectedLand = function(Lands, landIDs){
                return _.filter(Lands, function(land){
                    return land === landIDs[index];
                });
            };

我知道我会以错误的方式解决这个问题,并希望了解解决问题的适当方法。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

selectedLand = function(Lands, landIDs){
                return _.filter(Lands, function(land){
                    return land === landIDs[index];
                });
            };

请注意index在此范围内缺少任何定义,因此除了外部定义的index的幸运(?)事故外,此函数基本上不会返回true。只要您致电_.filter(someArr,function(){return false;}),您就会获得[]。除了未定义的index之外,这会将land对象与landIDs中的字符串(可能)进行严格比较

我对您的选择的确切要求有点不清楚,因此您可以根据自己的需要定制此过滤器。函数过滤 lands数组,检查.blocks数组属性是否具有某些.landID属性包含landsID数组中。

最后,如果您想充分利用lodash(或我最喜欢的ramda.js),我建议您坐下来阅读docs。听起来很无聊,但75%的数据转换战斗就是知道你的工具箱里有什么。请注意该过程的英文描述几乎与示例代码(过滤器,某些,包括)完全匹配。



var Lands = [{
    'LandId': '123',
    'something1': 'qwerty',
    'something2': 'qwerty',
    'Blocks': [{
      'id': '456',
      'LandId': '123'
    }, {
      'BlockId': '789',
      'LandId': '123'
    }]
  }
];

// assuming lands is like the above example
// and landIDs is an array of strings
var selectLandsWithBlocks = function(lands, landIDs) {
  return _.filter(lands, function(land) {    
    var blocks = land.Blocks;
    var blockHasALandId = function(block) {
      return _.includes(landIDs,block.LandId);
    };
    return _.some(blocks, blockHasALandId);
  });
};

console.log(selectLandsWithBlocks(Lands,[]));
console.log(selectLandsWithBlocks(Lands,['mittens']));
console.log(selectLandsWithBlocks(Lands,['123']));

<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script>
&#13;
&#13;
&#13;