【问题标题】:Convert object key to array with values number of key with Lodash [duplicate]使用Lodash将对象键转换为具有键值的数组[重复]
【发布时间】:2023-03-04 15:51:01
【问题描述】:

我有一个产品对象:

products: {
  bread: 1,
  milk: 2,
  cheese: 2,
  chicken: 1,
}

我想要一个带有这样产品名称的数组:

products: ['bread', 'milk', 'milk', 'cheese', 'cheese', 'chicken']

我试图将lodash 与reduce 方法一起使用,但我不知道如何在数组中“乘”这个产品。

我认为这不是一个好主意:

_.reduce(products, (result, value, key) => {
  for(let i = 0; i < value; i++) {
   result.push(key);
  }
  return result;
}, [])

如果有人能帮忙,我将不胜感激。

【问题讨论】:

  • 为什么您的解决方案不是一个好主意?编辑:如果你愿意,你可以减少两次(用 reduce 替换 for 循环)?
  • 您的解决方案似乎完全有效,我不会以任何其他方式这样做(除了不使用 lodash,因为我并没有真正挖掘它,但如果您仍然使用它......为什么不是)。
  • 如果你不喜欢使用for循环来“乘”产品,你可以改用Array#fill方法

标签: javascript arrays object lodash


【解决方案1】:

您可以在对象的entries 上使用flatMap

const products = {
  bread: 1,
  milk: 2,
  cheese: 2,
  chicken: 1,
}

const output = Object.entries(products).flatMap(([k, v]) => Array(v).fill(k))

console.log(output)

【讨论】:

    【解决方案2】:

    使用 lodash,您可以使用 _.flatMap() 迭代数组。使用_.overArgs() 创建回调,将值(通过_.identity())和密钥(用_.constant() 包装)传递给_.times():

    const obj = {
      products: {
        bread: 1,
        milk: 2,
        cheese: 2,
        chicken: 1,
      }
    }
    
    const result = _.flatMap(obj.products, _.overArgs(_.times, [_.identity, _.constant]))
      
    console.log(result)
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"&gt;&lt;/script&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 2019-07-14
      • 1970-01-01
      相关资源
      最近更新 更多