我无法在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];
});
};
我知道我会以错误的方式解决这个问题,并希望了解解决问题的适当方法。非常感谢任何帮助。
答案 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;