如何才能将以下对象合并为一个对象:
对象一
{"risks": [
{
"forests_wildlife": ["The landscape"],
"other": ["Something here"]
}
]}对象二
{"riskDetails": [
{
"forests_wildlife": "The landscape",
"affected_people": "1000-10,000",
"affected_wildlife": "2-5 wildlife populations"
},
{
"other": "Custom",
"affected_people": "100-1000",
"affected_wildlife": "5-10 wildlife populations"
}
]}期望输出
{"risks": [
{
"forests_wildlife": [
{
"The landscape" : {
"riskDetails": {
"affected_people": "1000-10,000",
"affected_wildlife": "2-5 wildlife populations"
}
}
}
],
"other": [
{
"Custom something" : {
"riskDetails": {
"affected_people": "100-1000",
"affected_wildlife": "5-10 wildlife populations"
}
}
}
]
},...
]}我真的很感谢任何人的帮助。只要解决方案有效,使用Lodash或不使用lodash就可以了。
编辑:
我认为,出于我的目的,我并不一定要将这两个对象组合成一个对象,而是只需遍历第一个对象中的每一项,并在第二个对象中找到匹配项。这是我想出来的一个片段,它对我很有效:
const riskCategory = data.risks;
const riskDetails = data.riskDetails;
return _.map(riskCategory, category => {
return _.map(category, (risk, key) => {
return _.map(risk, (item, index) => {
var details = _.find(riskDetails, _.matchesProperty( key, item ));
if ( details ) {
return (
<tr key={index}>
<td> {item} </td>
<td> {details.affected_people} </td>
<td> {details.affected_wildlife} </td>
</tr>
);
}
return;
});
});
});它是一个嵌套的map,在中间的某个地方使用find和matches,以便能够到达第二个对象的最里面的部分。也许有另一种方法可以做到这一点,更干净,更优雅。我是javascript的新手,我发现lodash让我的生活变得更轻松,但我不想太依赖它。
发布于 2021-01-28 23:24:37
一些可能的小改进
既然你问是否可以改进你写的算法,我试着做一些修改。
为了使测试独立于React、Babel和/或Typescript,我将
我可以在浏览器中快速试用这些功能吗?
当然了!我实际上做了一个Codepen,你可以直接在你的浏览器中尝试这两种实现,只需记住打开你的浏览器控制台来查看测试结果!这是链接:https://codepen.io/jhack_jos/pen/gOLYzvJ
两种可能的实现
使用.flattenDeep的
function testcase2(data)
{
const riskCategory = data.risks;
const riskDetails = data.riskDetails;
return _.chain(riskCategory)
.map( category => {
return _.map(category, (risk, key) => {
return _.map(risk, (item, index) =>
{
const details = _.find(riskDetails, [key, item]);
return details &&
"<tr key=" + index + ">" +
"<td> " + item + "</td>" +
"<td> " + details.affected_people + "</td>" +
"<td> " + details.affected_wildlife + "</td>" +
"</tr>";
});
});
})
.flattenDeep()
.compact()
.value();
}使用.flatMap的
function testcase3(data)
{
const riskCategory = data.risks;
const riskDetails = data.riskDetails;
return _.chain(riskCategory)
.flatMap( category => {
return _.flatMap(category, (risk, key) => {
return _.map(risk, (item, index) =>
{
const details = _.find(riskDetails, [key, item]);
return details &&
"<tr key=" + index + ">" +
"<td> " + item + "</td>" +
"<td> " + details.affected_people + "</td>" +
"<td> " + details.affected_wildlife + "</td>" +
"</tr>";
});
});
})
.compact()
.value();
}详细说明
.flattenDeep、.flatMap和Monads
您是否需要扁平化您的数据?
generated
.flattenDeep来移除所有嵌套,这是使用multiple .map的
_.flatMap,这可能会导致稍微更快的执行时间,所以我们不妨利用它。
.flatMap来实现函数组合。事实上,最简单形式的Monad是一个实现.flatMap的对象。长话短说,在地图之后扁平化集合的需求比人们最初可能想到的更引人注目,并且向许多possibilities.开放
其他注意事项
_.find(array, [key, value])
_.find函数的_.matchesProperty如果可能的话,最好避免在函数中有多个return语句,这样可以更容易地考虑算法和&&运算符,如果undefined为details,我们可以返回undefined。否则,右边的表达式就会返回,,
const,这样就达到了不变性。这很好,事实上,您还可以使用const.
details变量能够快速删除所有包含False值的数组元素,如false, null, 0, "", undefined, and NaN.感谢您的阅读!
我随时为您服务,您是否需要更多细节,或者代码是否与您正在寻找的代码不匹配。
https://stackoverflow.com/questions/49014936
复制相似问题