【问题标题】:Transforming array of objects containing arrays into a unique object lookup with lodash使用 lodash 将包含数组的对象数组转换为唯一的对象查找
【发布时间】:2021-02-12 19:58:31
【问题描述】:

如何使用lodashcodes 转换为result

const codes = [
   {a: 'aa', b: [ 8518 ], c: [ '2146' ]},
   {a: 'bb', b: [ 120123 ], c: [ 'D835', 'DD3B' ]},
   {a: 'cc', b: [ 168, 532 ], c: [ '00A8' ] }
]

const result = [
   {a: 'aa', b:8518, c:'2146'},
   {a: 'bb', b:120123, c:'D835'},
   {a: 'bb', b:120123, c:'DD3B'},
   {a: 'cc', b:168, c:'00A8'},
   {a: 'cc', b:532, c:'00A8'}
]

【问题讨论】:

  • 当您想要一个 lodash 解决方案时,为什么要使用 ecmascript-6 标记它?我的意思是,使用 ecmascript-6,你真的不需要 lodash 来完成这样的任务......
  • 因为我希望用现代 ES6 语法(扩展运算符、箭头函数等)编写答案。我从来没有说过你需要 lodash 来解决这个问题,但是我们有一个应用程序需要使用大量的 lodash 函数来维护,并且在 repo 中保持与其他代码相同的新功能是有意义的——它会更多持续的。有很多 lodash 用户,这个问题也可以使他们受益。如果这意味着您将删除您的反对票,我可以删除该标签!当然,如果我愿意,我有权使用 ES6 语法请求 lodash 答案吗?问题很明确。
  • 另外,请参阅:derickbailey.com/2016/09/12/…
  • 我无法删除反对票,因为我从未反对过这个问题。接受的答案证明了我的观点。

标签: javascript ecmascript-6 lodash


【解决方案1】:

使用嵌套的 Array.flatMap() 调用(或 lodash 的 _.flatMap())迭代主数组,使用 b 对象和 Array.map() 迭代 c 数组以创建具有所有组合的对象数组bc 的值:

const codes = [{ a: 'aa', b: [8518], c: ['2146'] }, { a: 'bb', b: [120123], c: ['D835', 'DD3B'] }, { a: 'cc', b: [168, 532], c: ['00A8'] }]

const result = codes.flatMap(o =>
  o.b.flatMap(b => 
    o.c.map(c => ({ ...o, b, c }))
  )
)

console.log(result)

【讨论】:

  • 谢谢你,正是需要的。
【解决方案2】:

使用纯 Javascript,您可以将问题分为两个任务,一个用于构建具有嵌套结构的数组的笛卡尔积,另一个用于映射笛卡尔积的部分结果。

getCartesian 是一个递归函数,如果包含对象的数组再次调用 getCartesian 并构建新对象,它会分离所有键/值对并通过迭代值来构建新的笛卡尔积。

function getCartesian(object) {
    return Object.entries(object).reduce((r, [k, v]) => {
        var temp = [];
        r.forEach(s =>
            (Array.isArray(v) ? v : [v]).forEach(w =>
                (w && typeof w === 'object' ? getCartesian(w) : [w]).forEach(x =>
                    temp.push(Object.assign({}, s, { [k]: x }))
                )
            )
        );
        return temp;
    }, [{}]);
}

var input =  [{ a: 'aa', b: [8518], c: ['2146'] }, { a: 'bb', b: [120123], c: ['D835', 'DD3B'] }, { a: 'cc', b: [168, 532], c: ['00A8'] }],
    cartesian = input.flatMap(o => getCartesian(o));

console.log(cartesian);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 这很好,但我更喜欢更紧凑的 lodash 答案。无论如何,谢谢,我相信它会帮助其他人!
猜你喜欢
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多