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
Javascript 如何变换和过滤数组_Javascript_Arrays_Algorithm_Object - Fatal编程技术网

Javascript 如何变换和过滤数组

Javascript 如何变换和过滤数组,javascript,arrays,algorithm,object,Javascript,Arrays,Algorithm,Object,我有一个数组,其中包含如下对象: [ { latitude: 00, longitude: 11 }, { latitude: 22, longitude: 33 }, { latitude: 00, longitude: 11 }, ] 我想将该数组转换并过滤为另一个数组,该数组包含数组,其中包含对象: 如果经度和纬度相等,则它们应位于同一数组中,因此,我需要一个新数组,如下所示: [ [ {

我有一个
数组
,其中包含如下对象:

[
  {
    latitude: 00,
    longitude: 11
  },
  {
    latitude: 22,
    longitude: 33
  },
  {
    latitude: 00,
    longitude: 11
  }, 
]
我想将该数组转换并过滤为另一个数组,该数组包含数组,其中包含对象:

如果经度和纬度相等,则它们应位于同一数组中,因此,我需要一个新数组,如下所示:

[
  [
    {
      latitude: 00,
      longitude: 11
    },
    {
      latitude: 00,
      longitude: 11
    }
  ],
  [
    {
      latitude: 22,
      longitude: 33
    }
  ]
]

您可以使用
纬度
经度
创建一个唯一键,并为对象累加器中的每个唯一键按数组中的每个对象。然后使用
Object.values()
提取所有值

const data=[{纬度:00,经度:11},{纬度:22,经度:33},{纬度:00,经度:11},],
结果=Object.values(data.reduce((r,{纬度,经度})=>{
常数键=纬度+经度;
r[键]=r[键]| |[];
r[key].push({纬度,经度});
返回r;
},{}));

控制台日志(结果)您可以将数组缩减为一个对象,其中纬度和经度形成一个唯一的键,并推送与之对应的值。然后使用Object.values返回数组

试着跟随

var arr=[{纬度:00,经度:11},{纬度:22,经度:33},{纬度:00,经度:11}];
var map=arr.reduce((a,c)=>{
var key=c.纬度+“”+c.经度;
a[键]=a[键]| |[];
a[键]。按(c);
返回a;
}, {});

console.log(Object.values(map))
缩减为一个对象,该对象的键表示数组对象的内容,其值为数组,并创建/推送到相应的数组:

const input=[{纬度:00,经度:11},{纬度:22,经度:33},{纬度:00,经度:11},]
常量输出=Object.values(
输入.减少((a,obj)=>{
const key=JSON.stringify(obj);
如果(!a[key])a[key]=[];
a[键]。推送(obj);
返回a;
}, {})
)

控制台日志(输出)这是过滤的解决方案,首先将数据分组,然后将其压缩为字符串

vara=[{纬度:21,经度:12},{纬度:211,经度:2},];
映射的var=a.reduce((acc,e)=>{
变量键=''+e.纬度+'',''+e.经度;
如果(!acc[key])acc[key]=[e];
else acc[键]。按下(e);
返回acc;
}, {});
log(Object.keys(mapped.map)((key)=>mapped[key]);
//编辑
console.log(Object.values(映射));

我建议您在
JSON
对象添加更新
count
中添加count字段,如果您两次发现相同的元素,否则上面的答案看起来不错

var数据=[{
纬度:00,,
经度:11
},
{
纬度:22,
经度:33
},
{
纬度:00,,
经度:11
},
]
var结果=[];
data.forEach(val=>{
常量filterIndex=result.findIndex(v=>v.latitude==val.latitude&&v.longitude==val.longitude);
filterIndex==-1?结果.push({…val,
计数:1
}):结果[filterIndex]。计数+=1;
});

控制台日志(结果)您可以对哈希表使用组合键来加速重复查找:

 const result = [], hash = {};

 for(const {latitude, longitude} of array) {
   const key = latitude + "_" + longitude;
   if(hash[key]) {
     hash[key].push({longitude, latitude});
   } else {
     result.push(hash[key] = [{longitude, latitude}]);
   }
 }

你想干什么?查看输入的预期输出,
[{经度:11,经度:00},{经度:22,经度:33},{经度:00,经度:11},]
?请注意,如果相同对象属性的顺序不同,则
JSON.stringify
将创建不同的字符串。这意味着,如果纬度和经度属性是不同的,则当前接受的答案将在相同的纬度和经度下对不同的数组进行分组。OP可以考虑或不考虑输入的工作,<代码> const输入= [{经度:11,纬度:00 },{纬度:22,经度:33 },{纬度:00,经度:11 },〕
不适用于输入,
常量a=[{纬度:21,经度:12},{纬度:211,经度:2},]
两个控制台日志调用似乎都将两个对象分组到一个数组中。OP似乎要求的是,只有当对象的经度和纬度值相同时,才将对象分组到同一数组中。@!谢谢!:)