Как создать массив из нескольких объектов из объекта, который представляет объекты - PullRequest
0 голосов
/ 15 января 2019

Я хочу конвертировать: {port:{0: 23, 1: 22},protocol:{0: "http",1:' "https"}}

до: [{port: 23, protocol: 'http' },{port: 22, protocol: 'https' }]

Я уже написал функцию, чтобы сделать это вручную.

Есть ли функция lodash, которая делает это? или манипулировать существующей функцией, чтобы получить желаемый результат?

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Вы можете перебирать записи из объектов и использовать внутренние ключи в качестве ключей для внешнего массива и наоборот.

var data = { port: { 0: 23, 1: 22 }, protocol: { 0: "http", 1: "https" } },
    result = Object.entries(data).reduce((r, [k, o]) => {
        Object.entries(o).forEach(([i, v]) => {
            r[i] = r[i] || {};
            r[i][k] = v;
        });
        return r;
    }, []);

console.log(result);
0 голосов
/ 15 января 2019

Нет ни одной функции lodash, которая делает это, но вы можете создать функцию через _.flow(), чтобы получить желаемый результат.

Вы можете преобразовать объект в массив массивов, которые содержат метку и значения, _.unzip() для транспонирования, а затем отобразить на объекты с помощью _.zipObject():

const obj = { port: {0: 23, 1: 22}, protocol: {0: "http",1: "https"} };

const fn = _.flow([
  o => _.map(o, (v, k) => [k, ..._.values(v)]), // convert to an array of label, ...values
  _.unzip, // transpose
  ([labels, ...values]) => _.map(values, v => _.zipObject(labels, v)) // create the ojects
]);

const result = fn(obj);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 15 января 2019

Это может быть один подход с использованием vanillajs.

Сопоставьте все порты и протоколы с двумя разными массивами. Затем создайте свой окончательный массив, получая значения из двух построенных массивов. Таким образом, вы будете иметь линейную сложность O(n).

const a = { port: {0: 23, 1: 22}, protocol: {0: "http",1: "https"} };
const ports = Object.values(a.port);
const protocols = Object.values(a.protocol);
const finalArr = ports.map((port, ind) => ({ port, protocol: protocols[ind] }));
console.log(finalArr);

Или вы можете использовать zip метод загрузки:

const a = { port: {0: 23, 1: 22}, protocol: {0: "http",1: "https"} };
const values = Object.values(a).map(e => Object.values(e));
const zipped = _.zip(...values).map(([port, protocol]) => ({ port, protocol }));
console.log(zipped);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
...