尝试 return 使用 Lodash 的深层嵌套对象

Trying to return a deep nested object with Lodash

我无法在 StackoverlFlow 上找到解决方案,我已经研究这个问题一段时间了。有点难所以如果我应该提供更多信息请告诉我。

我的问题: 我有一个 JSON Lands 对象,每个土地都有一个 ID 和一个与其关联的 Blocks 数组,并且那个 blocks 数组也有带有 ID 的块。

预览:

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

注意:数据没有按照我本来的方式设置,但这是很久以前完成的,我必须使用我现在拥有的东西。

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

所以最终结果将是一个 LandId 的列表,其中 return 从区块中编辑。

我正在使用类似的东西,但 return 没有结果:

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

我知道我正在以错误的方式解决这个问题,并且想知道处理和解决它的适当方法。非常感谢任何帮助。

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

请注意 index 在此范围内缺少任何定义,因此此函数基本上永远不会 return 为真,除非幸运(?)事故与外部定义的 index 相关。任何时候你打电话给 _.filter(someArr,function(){return false;}) 你都会得到 []。除了 Undefined index,这会严格比较 land 对象与(可能)landIDs

中的字符串

我不太清楚您选择的具体要求,因此您可以根据自己的需要定制此过滤器。函数 通过检查 .blocks 数组 属性 是否具有 some 值来过滤 lands 数组,其中.landID 属性 包含landsID 数组中。

最后,如果您想充分利用 lodash (or my favorite, ramda.js) I suggest you sit down and read the 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>