【问题标题】:lodash: create array on basis of object's child arraylodash:根据对象的子数组创建数组
【发布时间】:2015-10-23 11:09:34
【问题描述】:

我正在学习 Lodash 这是一个 javascript 库。

在这里,我有一个类似的对象:

场景 #1:

{
    name: 'abc'
    email: 'abc@example.com'
    z: [
        {
            time: '<any-time>',
            t: 't1'
        },
        {
            time: '<any-time>',
            t: 't2'
        },
        {
            time: '<any-time>',
            t: 't3'
        }
    ]
}

我想要使用 lodash 的结果:

[
    {
        name: 'abc'
        email: 'abc@example.com'
        z: [
            {
                time: '<any-time>',
                t: 't1'
            }           
        ]
    },
    {
        name: 'abc'
        email: 'abc@example.com'
        z: [
            {
                time: '<any-time>',
                t: 't2'
            }           
        ]
    },
    {
        name: 'abc'
        email: 'abc@example.com'
        z: [
            {
                time: '<any-time>',
                t: 't3'
            }           
        ]
    }
]

场景 #2:

{
    name: 'abc'
    email: 'abc@example.com'
    z: [
        {
            time: '<any-time>',
            t: 't1'
        },
        {
            time: '<any-time>',
            t: 't1'    // see here t1 repeated
        },
        {
            time: '<any-time>',
            t: 't3'
        }
    ]
}

那么结果应该是:

[
    {
        name: 'abc'
        email: 'abc@example.com'
        z: [
            {
                time: '<any-time>',
                t: 't1'
            },
            {
                time: '<any-time>',
                t: 't1'
            }           
        ]
    },
    {
        name: 'abc'
        email: 'abc@example.com'
        z: [
            {
                time: '<any-time>',
                t: 't3'
            }           
        ]
    }
]

如果我的详细信息还不清楚,请告诉我。

谢谢:)

编辑: 我尝试了以下代码,

var finalArr = [];
var baseInfo = _.omit(obj, 'z');
var childArr = obj.z;
for(var j = 0; j < childArr.length; j++){
    var flattenObj = angular.copy(baseInfo);
    flattenObj.z = [];
    flattenObj.z.push(childArr[j]);
    finalArr.push(flattenObj);
}

它只处理场景#1。而且我认为它比 lodash 使用更多的 javascript。

【问题讨论】:

  • @user2415266 检查我的编辑

标签: javascript lodash


【解决方案1】:

此代码适用于两种情况:

// I assume obj is the input object
var result = _.map(obj.z, function(value) {
    return {
        z : value,
        name : obj.name,
        email : obj.email
    };
});

请注意,此示例根本不需要 lodash。你可以简单地写这个:

// I assume obj is the input object
var result = obj.z.map(function(value) {
    return {
        z : value,
        name : obj.name,
        email : obj.email
    };
});

【讨论】:

  • 在场景 #1 中效果很好,但在场景 #2 中效果不佳。如果t 具有相同的值,它应该进入相同的z 数组。
【解决方案2】:

在 lodash 链中,将内部数组按t 分组,然后将每个组映射到一个新对象:

function collectAndCombine(obj) {
  return _(obj.z)
  .groupBy('t')
  .map(function(arr) {
    return _.assign(_.pick(obj, ['name', 'email']), { z: arr });
  })
  .value(); 
}

var obj1 = {
    name: 'abc',
    email: 'abc@example.com',
    z: [
        {
            time: '<any-time>',
            t: 't1'
        },
        {
            time: '<any-time>',
            t: 't2'
        },
        {
            time: '<any-time>',
            t: 't3'
        }
    ]
};

var obj2 = {
    name: 'abc',
    email: 'abc@example.com',
    z: [
        {
            time: '<any-time>',
            t: 't1'
        },
        {
            time: '<any-time>',
            t: 't1'    // see here t1 repeated
        },
        {
            time: '<any-time>',
            t: 't3'
        }
    ]
};

console.log(collectAndCombine(obj1));
  
console.log(collectAndCombine(obj2));
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.6/lodash.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 感谢您的回答。我会试试。它看起来很棒:)
  • 不客气 :) 我不确定它是否仍然相关。
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
相关资源
最近更新 更多