Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.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 reduce_Javascript - Fatal编程技术网

如何在对象数组上使用javascript reduce

如何在对象数组上使用javascript reduce,javascript,Javascript,我有一个对象数组,其中每个对象都有一个id键。 其中一些对象具有重新出现的id,我想删除这些重新出现的对象 例如: let array = [{ "id": "123", "country": "Brazil", "address": "xyz abc", "date": "Dec 17, 1995, 9:45:17 PM" }, { "id": "443", "country": "Russia", "address": "qwd

我有一个对象数组,其中每个对象都有一个id键。 其中一些对象具有重新出现的id,我想删除这些重新出现的对象

例如:

let array = [{
    "id": "123",
    "country": "Brazil",
    "address": "xyz abc",
    "date": "Dec 17, 1995, 9:45:17 PM"
  },
  {
    "id": "443",
    "country": "Russia",
    "address": "qwd qwd qwdqw",
    "date": "Dec 17, 1965, 9:45:17 PM"
  },
  {
    "id": "123",
    "country": "Canada",
    "address": "ktktkt",
    "date": "Dec 17, 1925, 9:45:17 PM"
  },
.
.
.
{}]
在上面的数组中,由于索引0和索引2共享相同的id键值,因此我想将它们从数组中完全删除

  • 我正在寻找复杂度方面的最佳代码,仅线性(O(n))

您根本不需要
reduce
——一个简单的
for
循环可以完成以下任务:

let数组=[{
“id”:“123”,
“国家”:“巴西”,
“地址”:“xyz abc”,
日期:“1995年12月17日,晚上9:45:17”
},
{
“id”:“443”,
“国家”:“俄罗斯”,
“地址”:“qwd qwd qwdqw”,
日期:“1965年12月17日,晚上9:45:17”
},
{
“id”:“123”,
“国家”:“加拿大”,
“地址”:“KTKT”,
“日期”:“1925年12月17日,晚上9:45:17”
}
]
array.forEach(i=>{
设为假
array.forEach(j=>{
如果(j==i){
发现++;
}
});
如果(找到){
array.forEach((k,l)=>{
如果(k==i){
阵列拼接(l,1);
l--;
}
});
}
});

console.log(数组)一种解决方案是将输入的
数组
聚合到键/值映射,其中值是共享相同
id的项目列表
。然后,您将通过从该映射中提取一个数组,过滤具有多个项的值,然后将这些单个项映射到最终输出:

let数组=[{
“id”:“123”,
“国家”:“巴西”,
“地址”:“xyz abc”,
日期:“1995年12月17日,晚上9:45:17”
},
{
“id”:“443”,
“国家”:“俄罗斯”,
“地址”:“qwd qwd qwdqw”,
日期:“1965年12月17日,晚上9:45:17”
},
{
“id”:“123”,
“国家”:“加拿大”,
“地址”:“KTKT”,
“日期”:“1925年12月17日,晚上9:45:17”
}
]
const result=Object.values(array.reduce)(映射,项)=>{
map[item.id]=(map[item.id]| |[]).concat([item]);
返回图;
}, {}))
.filter(项=>item.length==1)
.map(([项目]=>项目)

console.log(result)
您只需初始化一个
count
对象,并使用一个简单的
forEach
循环填充它,然后使用
过滤器即可。
let arr=[{id:“123”,国家:“巴西”,地址:“xyz abc”,日期:“1995年12月17日,晚上9:45:17”},{id:“443”,国家:“俄罗斯”,地址:“qwd qwd qwdqw”,日期:“1965年12月17日,晚上9:45:17”},{id:“123”,国家:“加拿大”,地址:“KTKTKTKTKTKTKT”,日期:“1925年12月17日,晚上9:45:17”}]
计数={}
arr.forEach(对象=>{
如果(计数[对象id]){
计数[obj.id]+=1
}否则{
计数[obj.id]=1
} 
})

console.log(arr.filter(obj=>count[obj.id]==1))
我不知道,可能是这个:

array.filter(function(d,i){return !this[d.id] && (this[d.id] = d.id)},{})

由于要完全删除重复的值,可以尝试此操作。首先找到重复,然后过滤原始数组

let数组=[{
“id”:“123”,
“国家”:“巴西”
},{
“id”:“443”,
“国家”:“俄罗斯”
},{
“id”:“123”,
“国家”:“加拿大”
},{
“id”:“123”,
“国家”:“加拿大”
},{
“id”:“345”,
“国家”:“英国”
}];
const removeDups=(数据)=>{
const dups=data.reduce((acc,{id})=>{
acc[id]=(acc[id]| 0)+1;
返回acc;
}, {});
返回data.filter(({id})=>dups[id]==1);
}
log(removeDups(数组))用于按id构建一个中间字典,其值是具有该id的所有项。然后使用枚举此字典的值,并使用筛选出具有多个元素的条目,然后使用以下方法展平结果:

const数组=[{
“id”:“123”,
“国家”:“巴西”,
“地址”:“xyz abc”,
日期:“1995年12月17日,晚上9:45:17”
},
{
“id”:“443”,
“国家”:“俄罗斯”,
“地址”:“qwd qwd qwdqw”,
日期:“1965年12月17日,晚上9:45:17”
},
{
“id”:“123”,
“国家”:“加拿大”,
“地址”:“KTKT”,
“日期”:“1925年12月17日,晚上9:45:17”
},
];
const singles=Object.values(array.reduce)(acc,x)=>{
acc[x.id]=[…(acc[x.id]| |[]),x];
返回acc;
}.filter(x=>x.length==1.flat();

console.log(单机版)
您可以使用
映射
,如果存在,将mapeed数组的长度设置为零。在末尾,单击所有数组

var数组=[{id:“123”,国家:“巴西”,地址:“xyz abc”,日期:“1995年12月17日,晚上9:45:17”},{id:“443”,国家:“俄罗斯”,地址:“qwd qwd qwdqw”,日期:“1965年12月17日,晚上9:45:17”},{id:“123”,国家:“加拿大”,地址:“KTKTKTKTKTKTKT”,日期:“1925年12月17日,晚上9:45:17”},
结果=[].concat(…array.map((m=>(o,i)=>{
var-temp=[];
如果(m.has(o.id)){
m、 get(o.id)。长度=0;
}否则{
m、 设置(o.id,temp=[o]);
}
返回温度;
})(新地图)

控制台日志(结果)无需减少,只需排序和筛选:

let数组=[{
“id”:“123”,
“国家”:“巴西”,
“地址”:“xyz abc”,
日期:“1995年12月17日,晚上9:45:17”
},
{
“id”:“443”,
“国家”:“俄罗斯”,
“地址”:“qwd qwd qwdqw”,
日期:“1965年12月17日,晚上9:45:17”
},
{
“id”:“123”,
“国家”:“加拿大”,
“地址”:“KTKT”,
“日期”:“1925年12月17日,晚上9:45:17”
},
]
const output=array.sort((a,b)=>a.id-b.id)。filter((项,索引,排序)=>{
const before=sorted[index-1]|{}
常量after=sorted[index+1]|{}
return item.id!==after.id&&item.id!==before.id
})

控制台日志(输出)这不是
reduce
的用例。这可能是
过滤器的一个用例,但实际上,您只需要一个简单的循环来跟踪您以前在
地图
(或对象)中临时看到的给定ID的对象。你在这里的最佳选择是做你的研究,为相关的主题,所以,并尝试一下。如果你在做了更多的研究和搜索后陷入困境,无法摆脱困境,那么就发布一篇你尝试的文章,并说spe