将重复值推入新数组

时间:2020-07-02 02:49:51

标签: javascript arrays loops object ecmascript-6

我有这样的对象数组

const data = [
  { 
     name: "John",
     transaction: "10/10/2010",
     item: "Bag"
  },
  { 
     name: "Steven",
     transaction: "31/10/2020",
     item: "Shoe"
  },
  { 
     name: "John",
     transaction: "18/06/2019",
     item: "Sock"
  }
]

您会看到该数组中对象的名称具有重复的名称,但交易不同

然后我想要这样的结果:

const result = [
  { 
     name: "John",
     transactions: [
         {
            date: "10/10/2010",
            item: "Bag"
         },
         {
            date: "18/06/2019",
            item: "Sock"
         }        
      ]
  },
  { 
     name: "Steven",
     transactions: [
         {
            date: "31/10/2020",
            item: "Shoe"
         }  
      ]
  },
]

所以新阵列记录了同一个人的新交易

5 个答案:

答案 0 :(得分:1)

一个简单的减少操作

const data = 
      [ { name: 'John',   transaction: '10/10/2010', item: 'Bag'  } 
      , { name: 'Steven', transaction: '31/10/2020', item: 'Shoe' } 
      , { name: 'John',   transaction: '18/06/2019', item: 'Sock' } 
      ] 
     
const result = data.reduce((a,{name,transaction:date,item})=>
      {
      let x = a.find(e=>e.name===name)
      if (!x) 
        {
        let n = a.push({name, transactions:[]}) -1
        x = a[n]         
        }
      x.transactions.push({date,item})
      return a
      },[])

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

短版

const result = data.reduce((a,{name,transaction:date,item})=>
      {
      let x = a.find(e=>e.name===name) || (a[a.push({name, transactions:[]}) -1])       
      x.transactions.push({date,item})
      return a
      },[])

答案 1 :(得分:1)

此代码为:

const data = [
  { 
     name: "John",
     transaction: "10/10/2010",
     item: "Bag"
  },
  { 
     name: "Steven",
     transaction: "31/10/2020",
     item: "Shoe"
  },
  { 
     name: "John",
     transaction: "18/06/2019",
     item: "Sock"
  }
]

let Transactions = []

data.forEach(data => {
       Transactions.some(t => {
            if(t.name === data.name){
            t.transactions.push({date:data.transaction,item:data.item})
            return;
            }
            })

            Transactions.push({
                name:data.name,
                transactions:[
                    {date:data.transaction,item:data.item}
                ]
            })
            console.log(Transactions);
})
我认为

array.some优于forEach循环。所以决定坚持下去。

答案 2 :(得分:0)

请尝试以下示例

const data = [
  {
    name: "John",
    transaction: "10/10/2010",
    item: "Bag",
  },
  {
    name: "Steven",
    transaction: "31/10/2020",
    item: "Shoe",
  },
  {
    name: "John",
    transaction: "18/06/2019",
    item: "Sock",
  },
];

const output = data.reduce((previousValue, { name, transaction, item }) => {
  const index = previousValue.findIndex((entry) => entry.name === name);

  if (index === -1) {
    previousValue = [
      ...previousValue,
      {
        name: name,
        transactions: [{ date: transaction, item }],
      },
    ];
  } else {
    previousValue[index].transactions = previousValue[
      index
    ].transactions.concat({
      date: transaction,
      item,
    });
  }

  return previousValue;
}, []);

console.dir(output, { depth: null, color: true });

请参见

答案 3 :(得分:0)

您可以通过实用的方法使其可读,下面的解决方案是使用ramdajs

const data = [
  {
    name: 'John',
    transaction: '10/10/2010',
    item: 'Bag'
  },
  {
    name: 'Steven',
    transaction: '31/10/2020',
    item: 'Shoe'
  },
  {
    name: 'John',
    transaction: '18/06/2019',
    item: 'Sock'
  }
]

const result = pipe(
  groupBy(obj => obj.name),
  mapObjIndexed((groupObjs, groupName) => ({
    name: groupName,
    transactions: map(
      groupObj => ({
        date: groupObj.transaction,
        item: groupObj.item
      }),
      groupObjs
    )
  })),
  values
)(data)

console.log(result)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
<script>const { groupBy, mapObjIndexed, pipe, map, values } = R</script>

这里是ramdajs doc

的链接

答案 4 :(得分:-1)

如何使用lodash的infinite loop函数?

_.groupBy()
const data = [
  { 
     name: "John",
     transaction: "10/10/2010",
     item: "Bag",
  },
  { 
     name: "Steven",
     transaction: "31/10/2020",
     item: "Shoe",
  },
  { 
     name: "John",
     transaction: "18/06/2019",
     item: "Sock",
  }
]

const result = _.groupBy(data, "name")
console.log(result)