【问题标题】:How to move nested object into top level without removing top level?如何在不删除顶层的情况下将嵌套对象移动到顶层?
【发布时间】:2015-12-04 16:06:57
【问题描述】:

假设我有这个数据:

data = [{
    "_id" : "2fApaxgiPx38kpDLA",
    "profile" : {
        "name" : "Karina 1",
        "avatar" : "avatar1.jpg",
        "bio" : "my bio 1"
},
{
    "_id" : "NXM6H4EWfeRAAhB7c",
    "profile" : {
        "name" : "Karina 2",
        "avatar" : "avatar2.jpg",
        "bio" : "my bio 2"
    },
}];

我做了_.map(data, "profile"),但它删除了顶级_id:

wrongResult = [{
    "name" : "Karina 1",
    "avatar" : "avatar1.jpg",
    "bio" : "my bio 1"
},
{
    "name" : "Karina 2",
    "avatar" : "avatar2.jpg",
    "bio" : "my bio 2"  
}];

如何将嵌套对象移动到顶层而不像这样删除顶层:

expectedResult = [{
    "_id" : "2fApaxgiPx38kpDLA",
    "name" : "Karina 1",
    "avatar" : "avatar1.jpg",
    "bio" : "my bio 1"
},
{
    "_id" : "NXM6H4EWfeRAAhB7c",
    "name" : "Karina 2",
    "avatar" : "avatar2.jpg",
    "bio" : "my bio 2"  
}];

非常感谢……

【问题讨论】:

标签: javascript underscore.js lodash


【解决方案1】:

像这样的东西? (未测试)

_.map(data,function(d){
    d.profile._id = d._id;
    return d.profile;
});

【讨论】:

    【解决方案2】:

    最近需要自己做这样的事情。最终编写了一个通用函数来将所有(包括嵌套的)对象值带到顶层:

    const reduceObjValues = (obj, cache = {}) => {
        const objectValues = Object.keys(obj).reduce((acc, cur) => {
            if (!Array.isArray(obj[cur]) && typeof obj[cur] === 'object') {
                return reduceObjValues({ ...acc, ...obj[cur] }, cache);
            }
            acc[cur] = obj[cur];
    
            return acc;
        }, {});
    
        return {
            ...objectValues,
            ...cache,
        };
    }
    reduceObjValues({
      a: {
        b: 'a',
        c: 'b',
      },
      d: {
        e: 'a',
        f: {
          g: {
            h: [
              1,
              2,
              3,
            ]
          }
        }
      }
    });
    => { b: 'a', c: 'b', e: 'a', h: [ 1, 2, 3 ] }
    

    这个函数的一个问题是它会覆盖任何相同的键。

    【讨论】:

      【解决方案3】:

      您可以使用 flatten 将嵌套对象移动到其父级...https://www.npmjs.com/package/flat

      【讨论】:

      • 它用点作为分隔符将每个级别展平。
      • 我的意思是让你举一个例子来解决你帖子中问题中的问题:)
      【解决方案4】:

      由于您使用的是 lodash,我想出了一个通用函数来展平任何深度嵌套的对象。

      const flattener = obj => {
              const toPairs = obj => _.entries(obj).map(([key, val]) => typeof val === 'object' ? toPairs(val) : [key, val]);
              return _.chain(toPairs(obj)).flattenDeep().chunk(2).fromPairs().value();
          }
      

      所以,像这样的数组

      data = [
      {
          "_id" : "2fApaxgiPx38kpDLA",
          "profile" : {
              "name" : "Karina 1",
              "avatar" : "avatar1.jpg",
              "bio" : "my bio 1"
          }
      },
      {
          "_id" : "NXM6H4EWfeRAAhB7c",
          "profile" : {
              "name" : "Karina 2",
              "avatar" : "avatar2.jpg",
              "bio" : "my bio 2"
          },
      }
      ]
      

      你可以的

      data.map(obj => flattener(obj))
      

      这会给你

      [
          {
              "_id": "2fApaxgiPx38kpDLA",
              "name": "Karina 1",
              "avatar": "avatar1.jpg",
              "bio": "my bio 1"
          },
          {
              "_id": "NXM6H4EWfeRAAhB7c",
              "name": "Karina 2",
              "avatar": "avatar2.jpg",
              "bio": "my bio 2"
          }
      ]
      
      

      注意:这个flattener函数会丢弃重复的对象键,所以如果你有一个像这样的对象;

      myObj = { name: 'rick', age: 10, country: { name: 'uganda' } }
      

      通过调用flattener(myObj) 将其展平将导致

      { name: 'uganda', age: 10 }
      

      而不是在

      { name: 'uganda', age: 10, name: 'rick' }
      

      因为您不能拥有具有 2 个相似键的对象,即使这些键的值是唯一的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-08
        • 2017-09-03
        • 2012-06-13
        • 1970-01-01
        • 2015-01-29
        • 1970-01-01
        • 2020-06-22
        相关资源
        最近更新 更多