Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除重复键并在JavaScript数组中组合唯一值_Javascript_Arrays_Merge_Lodash - Fatal编程技术网

删除重复键并在JavaScript数组中组合唯一值

删除重复键并在JavaScript数组中组合唯一值,javascript,arrays,merge,lodash,Javascript,Arrays,Merge,Lodash,我有一个数组,其中包含客户ID、事务值和客户执行的每个事务的事务ID 我有9000名客户完成了20000笔交易。 我想要一个客户ID,一个包含每个客户ID的所有价格的数组,以及一个包含每个客户ID的所有交易ID的数组 目前看起来是这样的: var transactionArray = { customerId: '1', price: [ 100 ], transactionID: ['00a13'] }, { customerId: '2', price: [ 200 ],

我有一个数组,其中包含客户ID、事务值和客户执行的每个事务的事务ID

我有9000名客户完成了20000笔交易。 我想要一个客户ID,一个包含每个客户ID的所有价格的数组,以及一个包含每个客户ID的所有交易ID的数组

目前看起来是这样的:

var transactionArray =
{
  customerId: '1',
  price: [ 100 ],
  transactionID: ['00a13']
},
{
  customerId: '2',
  price: [ 200 ],
  transactionID: ['00a14']
},
{
  customerId: '1',
  price: [ 700 ],
  transactionID: ['00a15']
},
{
  customerId: '2',
  price: [ 1700 ],
  transactionID: ['00a16']
},

... 19996 more items
var customerArray =

{
  customerId: '1',
  price: [ 100, 700 ],
  transactionID: ['00a13', '00a15']
},
{
  customerId: '2',
  price: [ 200, 1700 ],
  transactionID: ['00a14', '00a16']
},

...8998 more items
我希望它看起来像这样:

var transactionArray =
{
  customerId: '1',
  price: [ 100 ],
  transactionID: ['00a13']
},
{
  customerId: '2',
  price: [ 200 ],
  transactionID: ['00a14']
},
{
  customerId: '1',
  price: [ 700 ],
  transactionID: ['00a15']
},
{
  customerId: '2',
  price: [ 1700 ],
  transactionID: ['00a16']
},

... 19996 more items
var customerArray =

{
  customerId: '1',
  price: [ 100, 700 ],
  transactionID: ['00a13', '00a15']
},
{
  customerId: '2',
  price: [ 200, 1700 ],
  transactionID: ['00a14', '00a16']
},

...8998 more items

只需使用reduce并将元素推送到阵列上

var transactionArray=[{
customerId:'1',
价格:[100],
事务ID:['00a13']
},
{
customerId:'2',
价格:[200],
事务ID:['00a14']
},
{
customerId:'1',
价格:[700],
事务ID:['00a15']
},
{
customerId:'2',
价格:[1700],
事务ID:['00a16']
},
]
var results=Object.values(transactionArray.reduce((custs,{customerId,price,transactionID})=>{
var customer=custs[customerId]
如果(!客户){
客户[客户ID]={
customerId:customerId,
价格:[…价格],
transactionID:[…transactionID]
}
}否则{
customer.price=[…customer.price,…price]
customer.transactionID=[…customer.transactionID,…transactionID]
}
返回客户
}, {}))

console.log(results)
客户ID是整数很方便。如果发生变化,则需要对其进行索引,然后重建对象

//为保存customerID的顺序创建一个单独的数组
const customerIds=[]
const result=transactionArray
.reduce((acc,{customerId,price,transactionID})=>{
const idIndex=customerIds.indexOf(customerId)
//检查customerId数组中是否存在customerId
if(idIndex<0){
//如果没有,则将其添加到customerId的数组中
customerId.push(customerId)
//然后将匹配的价格和transactionID添加到累加器中
//其中,将数组的内容分散到2个新数组中。
acc.push([[…价格],…交易ID]]
}否则{
//如果customerId已入账,则
//将价格和transactionID添加到该客户的bucket中
//在customerId中存在customerId的同一索引中
acc[idIndex][0]。推送(…价格)
acc[idIndex][1]。推送(…事务ID)
}
返回acc
}, [])
//最后,将数组转换回对象
.map((值、索引)=>{
返回({
customerId:customerId[索引],
价格:价值[0],
transactionID:值[1],
})
})
console.log(结果)
哪些日志:

[
{
customerId:'1',
价格:[100700],
事务ID:['00a13','00a15']
},
{
customerId:'2',
价格:[2001700],
事务ID:['00a14','00a16']
}
]

如果CustomerID是不表示整数的字符串,这仍然有效——例如,如果您的客户数据如下所示:

const transactionArray=[
{
customerId:'324asdrea',
价格:[100],
事务ID:['00a13']
},
{
customerId:'4HDFGI2',
价格:[200],
事务ID:['00a14']
},
{
customerId:'324asdrea',
价格:[700],
事务ID:['00a15']
},
{
customerId:'4HDFGI2',
价格:[1700],
事务ID:['00a16']
}
]
其结果是:

[
{
customerId:'324asdrea',
价格:[100700],
事务ID:['00a13','00a15']
},
{
customerId:'4HDFGI2',
价格:[2001700],
事务ID:['00a14','00a16']
}
]

在初始数据中,作为单个数组存储的价格和交易数据是否仅包含1项?正确。起初不是这样,但我尝试使用for循环来连接每个对象中的数组。我有意将其作为数组推送到事务数组中,但它可以切换回来。请查看lodash的groupBy函数如果将数组作为第一个参数,将customerId作为第二个参数,它将根据项目的ID对项目进行分组,然后,您可以展平分组数据或使用缩减器。使用对象或映射收集所有唯一ID,然后将每个价格和交易合并在一起。我认为这个答案假设
customerId
始终是一个整数字符串。如果customerId除了正整数之外还有其他内容,那么从
custs
中获取
customer
将不起作用,对吗?@sinanbollel为什么它是什么重要?这是一个字符串。如果客户id看起来像
aef64d
,那么
var customer=custs[customerId]
还会找到客户吗?我可能误解了这里的某些内容。这是日志记录。{customerId:'1',price:[100],transactionId:['00a13'],未定义:{price:[由19999个其他价格组成的数组],transactionId:[由19999个其他transactionId组成的数组],即使存在…
var arr=[];arr[-1]=11111;console.log(arr)
请注意,@epascarello也很有效,只有一个reduce,这是更好的答案。一个真正的英雄!谢谢!我已经用了好几天的时间,试图用一种简洁的方式来做这件事。这帮了大忙。我同时也非常沮丧,因为我显然不懂减速机的功能。哈哈,真的,我真的不懂t在jsperf上运行了测试,这个答案比另一个略好。@FreshCeviche不客气,很高兴你得到了它。函数式javascript很棒:)