Javascript 如何从对象数组中删除所有重复?
我正在成功地重复阵列以仅生成唯一值。问题是,我需要删除两个重复项,例如:如果有两个对象具有相同的用户id密钥,我希望从数组中删除两个对象,而不是一个 一个选项是迭代数组,并将当前正在迭代的对象放在该对象的user_id属性上。如果该属性已存在,请将其重新指定为null。最后,获取对象的值并删除空值: 常量totalArray=[{ id:rec01dTDP9T4ZtHL4, 字段:{ 用户id:170180717, 用户名:abcdefg, 活动编号:516575, } }, { id:rec01dTDP9T4ZtHL4, 字段:{ 用户id:170180717, 用户名:abcdefg, 活动编号:516575, } }, { id:独一无二, 字段:{ 用户id:1234, 用户名:abcdefg, 活动编号:516575, } }]; const uniques={}; 对于totalArray的常量项{ const prop=item.fields.user\u id; uniques[prop]=uniques.hasOwnPropertyprop 无效的 :项目; } 常量输出=Object.valuesuniques.filterBoolean;Javascript 如何从对象数组中删除所有重复?,javascript,arrays,Javascript,Arrays,我正在成功地重复阵列以仅生成唯一值。问题是,我需要删除两个重复项,例如:如果有两个对象具有相同的用户id密钥,我希望从数组中删除两个对象,而不是一个 一个选项是迭代数组,并将当前正在迭代的对象放在该对象的user_id属性上。如果该属性已存在,请将其重新指定为null。最后,获取对象的值并删除空值: 常量totalArray=[{ id:rec01dTDP9T4ZtHL4, 字段:{ 用户id:170180717, 用户名:abcdefg, 活动编号:516575, } }, { id:rec
console.logoutput 您可以首先根据用户id对对象进行分组。然后根据组大小对对象进行分区。如果组只包含一条记录,则该记录是唯一的。然后将这些组展平,使其最终成为一个普通的记录数组,而不是一个记录组数组 函数groupByiterable,fn{ 常量组=新映射; 对于iterable的常量项{ const key=fn项; 如果!groups.haskey groups.setkey,[]; groups.getkey.pushitem; } 返回组; } 功能可划分,fn{ 常量truthy=[],falsy=[]; 对于iterable的常量项{ fnitem?truthy:falsy.pushitem; } 返回[真理,法尔西]; } 常量totalArray=[{ id:rec01dTDP9T4ZtHL4, 字段:{ 用户id:170180717, 用户名:abcdefg, 活动编号:516575, } }, { id:rec01dTDP9T4ZtHL4, 字段:{ 用户id:170180717, 用户名:abcdefg, 活动编号:516575, } }, { id:独一无二, 字段:{ 用户id:1234, 用户名:abcdefg, 活动编号:516575, } }]; 常量[uniqueArray,duperray]= 隔断 groupBytotalArray,record=>record.fields.user\u id.values, group=>group.length==1 .mapgroups=>groups.flat1; console.loguniqueArray=,uniqueArray; console.logduperray=,duperray 您可以使用Array.reduce&&Array 设totalArray=[ { id:rec01dTDP9T4ZtHL4, 领域: { 用户id:170180717, 用户名:abcdefg, 活动编号:516575, } }, { id:rec01dTDP9T4ZtHL4, 领域: { 用户id:170180717, 用户名:abcdefg, 活动编号:516575, } }, { id:rec01dTDP9T4ZtHL4, 领域: { 用户id:1470107417, 用户名:abcdefg, 活动编号:516575, } }, { id:rec01dTDP9T4ZtHL4, 领域: { 用户id:1470107417, 用户名:abcdefg, 活动编号:516575, } }, { id:rec01dTDP9T4ZtHL4, 领域: { 用户id:14701073417, 用户名:abcdefg, 活动编号:516575, } } ]; 让removeDups=totalArray.reduceresult,项,索引,原始=>{ 如果original.someo,i=>o.fields.user\u id===item.fields.user\u id&&i!==索引返回结果; 结果.项目; 返回结果; },[]
console.logremoveDups;之间是否应该有空白?空的呢?我得到了一个错误:在“?”之前有错误的换行。这是不必要的,但大多数人会发现,当操作符与其操作数至少间隔一个空格时,它更可读?null在我看来真的很奇怪。如果你有一个禁止它的linting规则,请根据你的应用程序的标准来修复它project@CertainPerformance为什么const uniques={}设置为空对象?@GPP该对象用作一种机制,用于检查到目前为止遇到特定用户id的次数。它一开始是空的,因为在脚本的开头没有迭代任何元素。uniques[prop]=uniques.hasOwnPropertyprop?null:项目也可以写为uniques[prop]=!uniques.hasOwnPropertyprop&&item取决于首选的编程风格。此外,您可以检查结果数组是否不包含当前项,并且它的性能更高。
// This is a large array of objects, e.g.:
let totalArray = [
{"id":"rec01dTDP9T4ZtHL4","fields":
{"user_id":170180717,"user_name":"abcdefg","event_id":516575,
}]
let uniqueArray = [];
let dupeArray = [];
let itemIndex = 0
totalArray.forEach(x => {
if(!uniqueArray.some(y => JSON.stringify(y.fields.user_id) === JSON.stringify(x.fields.user_id))){
uniqueArray.push(x)
} else(dupeArray.push(x))
})
node.warn(totalArray);
node.warn(uniqueArray);
node.warn(dupeArray);
return msg;