如何连接对象数组并返回单个数组



我从Geoserver收到了4个数组。这些数组中的每一个都包含保存latlng数据的对象,此处为geoserver响应。我需要将这4个数组合并到一个单个数组中,然后将其中的对象转换为数组。这被用来构建另一个API的一些其他响应:

var routes = e.routes[0].coordinates
var coords = routes.map(function(obj){
return Object.keys(obj).sort().map(function(key){
return obj[key];
})
})

这是路线和这是coordscoords是Geoserver响应的预期结果。我得到了地理服务器的响应。结构如我这样做后的图像所示:

function goPark(routeLayer){ 
var finalRoute = routeLayer._layers;
var coordsArray = Object.keys(finalRoute).map(key => {
return finalRoute[key]
});
coordsArray.forEach(function(data){
var xy = data._latlngs;
}) 

如果我继续下面的代码,我会收到按我想要的结构排列的数组,请参见此处,但仍然是分开的。我需要以某种方式将它们合并到一个数组中!

var xxy = xy.map(function(obj){
return Object.keys(obj).map(function(key){
return obj[key];
})
})

对于这类任务,有一个很棒的npm包,我曾经使用过它,叫做deepmerge您可以使用它将一个或多个数组或对象合并为一个,并控制可枚举属性。

如果只有在访问时才需要延迟加载值,则可以将累加器函数转换为生成器(以提高性能(。你还可以做其他事情,比如使用承诺和生成器来产生价值。不过,如果您没有看到任何性能问题,那就没有必要了。

function accGoPark(reset) {
return accFn(goPark, reset);
}
function accFn(fn, reset) {
const accs = accFn.accs = accFn.accs || {};
const { name } = fn;
accs[name] = !accs[name] || reset ? [] : accs[name];
accs[name] = accs[name].concat( fn() );
return accs[name];
}

您只是将变量xy设置为对上次数据的引用_latlngs在你的forEach循环中迭代,这就是为什么你只得到最后一个。你应该直接映射坐标数组。

xxy = coordsArray.map(function(data){
var obj = data._latlngs;
return Object.keys(obj).map(function(key){
return obj[key];
})
})

使用Object.values、destructuring和arrow函数来简化语法:

xxy = routeLayer.map( ({ _layers: { _latlngs: xy })  => Object.values(xy) );

最新更新