首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用lodash合并对象

使用lodash合并对象
EN

Stack Overflow用户
提问于 2018-02-28 01:50:29
回答 1查看 117关注 0票数 1

如何才能将以下对象合并为一个对象:

对象一

代码语言:javascript
复制
{"risks": [
    {
        "forests_wildlife": ["The landscape"],
        "other": ["Something here"]
    } 
]}

对象二

代码语言:javascript
复制
{"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"
    } 
]}

期望输出

代码语言:javascript
复制
{"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就可以了。

编辑:

我认为,出于我的目的,我并不一定要将这两个对象组合成一个对象,而是只需遍历第一个对象中的每一项,并在第二个对象中找到匹配项。这是我想出来的一个片段,它对我很有效:

代码语言:javascript
复制
        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让我的生活变得更轻松,但我不想太依赖它。

EN

回答 1

Stack Overflow用户

发布于 2021-01-28 23:24:37

一些可能的小改进

既然你问是否可以改进你写的算法,我试着做一些修改。

为了使测试独立于React、Babel和/或Typescript,我将

  • 语法转换为更简单的字符串concatenation.
  • to,从而使函数更有用。我假设您还想展平结果数组并清除集合中的任何False值,以便获得易于使用的数据格式。

我可以在浏览器中快速试用这些功能吗?

当然了!我实际上做了一个Codepen,你可以直接在你的浏览器中尝试这两种实现,只需记住打开你的浏览器控制台来查看测试结果!这是链接:https://codepen.io/jhack_jos/pen/gOLYzvJ

两种可能的实现

使用.flattenDeep的

代码语言:javascript
复制
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

代码语言:javascript
复制
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

  • yet,

  • 你当然可以利用.flattenDeep来移除所有嵌套,这是使用multiple .map

  • 给你一个更好的方式:_.flatMap,这可能会导致稍微更快的执行时间,所以我们不妨利用它。

  • 如果你对the Monad buzzword感兴趣,你应该知道这实际上与Monad的概念有关,即使这里我们不使用.flatMap来实现函数组合。事实上,最简单形式的Monad是一个实现.flatMap的对象。长话短说,在地图之后扁平化集合的需求比人们最初可能想到的更引人注目,并且向许多possibilities.

开放

其他注意事项

_.find(array, [key, value])

  • it在语法中已经包含了_.find函数的_.matchesProperty如果可能的话,最好避免在函数中有多个return语句,这样可以更容易地考虑算法和&&运算符,如果undefineddetails,我们可以返回undefined。否则,右边的表达式就会返回,

  • ,我看到你用的是const,这样就达到了不变性。这很好,事实上,您还可以使用const.

  • you函数使details变量能够快速删除所有包含False值的数组元素,如false, null, 0, "", undefined, and NaN.

感谢您的阅读!

我随时为您服务,您是否需要更多细节,或者代码是否与您正在寻找的代码不匹配。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49014936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档