Как объединить массивы объектов и вернуть один массив массивов? - PullRequest
0 голосов
/ 04 мая 2020

Я получаю 4 массива от 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];
                        })
                    })

Это маршрутов , и это координаты и координаты - ожидаемый результат для ответа геосервера. Я получаю свой ответ геосервера . после того, как я это сделал, структурировано, как показано на рисунке:

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];
        })
    })

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Если вам нужна отложенная загрузка значений только при доступе к ней, вы можете превратить функцию аккумулятора в генератор (для производительности). Есть и другие вещи, которые вы можете сделать, например, использовать обещания и генератор для получения значений. Хотя, если вы не видите каких-либо проблем с производительностью, это не нужно.

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 в качестве ссылки на ваши последние данные. Вы получаете только последний. Вы должны просто отобразить ordasArray напрямую.

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

Использование Object.values, деструктуризации и функций стрелок для упрощения синтаксиса:

xxy = routeLayer.map( ({ _layers: { _latlngs: xy })  => Object.values(xy) );
0 голосов
/ 04 мая 2020

Существует замечательный пакет npm для этой задачи, который я использовал однажды и который называется deepmerge . Вы можете использовать его для объединения одного или нескольких массивов или объектов в один и управления перечисляемыми свойствами.

...