【问题标题】:Merge two object in a array [closed]合并数组中的两个对象[关闭]
【发布时间】:2016-12-15 20:18:39
【问题描述】:

我有这个数组

var arr1 = [{id: 1, name: "lorem"}, {id: 1, name: "ipsum"}, {id: 2, name: "dolor"}]

你可以在这里看到他们得到相同的前 2 个索引 id,我希望输出是这样的

newArr

[
  {
    id: 1,
    name: ["lorem", "ipsum"]
  },
  {
    id: 2,
    name: "dolor"
  }
]

【问题讨论】:

    标签: javascript ecmascript-6


    【解决方案1】:

    使用reduce和map,你可以很容易地把它转换成你想要的

    var arr1 = [{id: 1, name: "lorem"}, {id: 1, name: "ipsum"}, {id: 2, name: "dolor"}];
    
    var obj = arr1.reduce((a,b) => (b.id in a?a[b.id].push(b.name):a[b.id]=[b.name],a),{}),
        newArr = Object.keys(obj).map( id => ({id, name : obj[id]}));
    
    console.log(newArr);

    【讨论】:

    • 不幸的是,数组索引0 中没有任何内容。既然这被标记为 ES6,为什么不使用正确的 Map 而不是那个数组呢?
    【解决方案2】:

    我更喜欢这个解决方案,因为它抽象了排序规则,但允许您使用高阶函数控制如何项排序。

    请注意,我们在collateBy 中没有提及x.idx.namenames.concat([name])。此过程不知道您可能正在整理的数据的种类

    // generic collation procedure
    const collateBy = f => g => xs => {
      return xs.reduce((m,x) => {
        let v = f(x)
        return m.set(v, g(m.get(v), x))
      }, new Map())
    }
    
    // reusable collateById procedure
    const collateById = collateBy (x => x.id)
    
    // custom concatNames procedure
    // note use of `{name:[]}` which is the "seed" value for an empty collation
    const concatNames = xs=> {
      let collation = collateById ((a={name:[]}, b) =>
        Object.assign(a, b, { name: [...a.name, b.name] })
      ) (xs)
      return Array.from(collation.values())
    }
    
    // sample data
    let arr1 = [
      {id: 1, name: "lorem"},
      {id: 1, name: "ipsum"},
      {id: 2, name: "dolor"}
    ]
    
    console.log(concatNames (arr1))

    高阶函数展示了像collateBy 这样的通用过程有多么强大。这是另一个使用完全相同的collateBy 过程但执行非常不同的排序规则的示例

    const collateBy = f => g => xs => {
      return xs.reduce((m,x) => {
        let v = f(x)
        return m.set(v, g(m.get(v), x))
      }, new Map())
    }
    
    const collateEvenOdd = collateBy (x => x % 2 === 0 ? 'even' : 'odd')
    
    const sumEvenOdd = collateEvenOdd ((a=0, b) => a + b)
    
    let data = [2,3,4,5,6,7]
    let collation = sumEvenOdd (data)
    let even = collation.get('even')
    let odd = collation.get('odd')
    
    console.log('even sum', even) // 2 + 4 + 6 === 12
    console.log('odd sum', odd)   // 3 + 5 + 7 === 15

    【讨论】:

    • 巧妙使用默认初始化程序!
    • 谢谢!感谢Array.from 的编辑。我忘了那个^_^
    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多