Свести вложенный массив в словаре - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть словарь, который имеет вложенный массив, скажем,

let data = {"date" : "01.01.2017", "foo":["mama", "papa", "sister", "brother"]};

Теперь мне нужно (хочу) сделать массив 'foo' частью словаря, чтобы «данные» выглядели как:

let newData = {"date" : "01.01.2017", "foo_1":"mama", "foo_2":"papa", "foo_3":"sister", "foo_4":"brother"};

Я гуглил и нашел несколько решений, которые близки по теме, но не совсем то, что мне нужно: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap

https://gist.github.com/ArtemAvramenko/d92c92ff1b74cbc55be226dcabff90cc

Уплощение словаря Javascript, сохранение вложенных ключей

Я новичок в машинописи и очень хочу помочь.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Вот функция, которая сгладит вложенные массивы (только на один уровень глубиной).Перебирает все значения вложенного массива и добавляет их в качестве свойств родительского объекта, затем удаляет вложенный массив.

let data = {"date": "01.01.2017", "foo": ["mama", "papa", "sister", "brother"]};

function flattenNested(obj: Object) {
    for (let prop in obj) {
        if (obj[prop] instanceof Array) {
            obj[prop].forEach((val, index) => {
                obj[prop + '_' + (index + 1)] = val;
            });
            delete obj[prop];
        }
    }
    return obj;
}

console.log(flattenNested(data));
// { date: "01.01.2017", foo_1: "mama", foo_2: "papa", foo_3: "sister", foo_4: "brother" }
0 голосов
/ 28 сентября 2018

Я не думаю, что есть какой-либо автоматический способ сделать то, что вы хотите, так что просто пройдите по клавишам и создайте новый объект вручную.

let newData = {date: data.date}

data.foo.forEach((value, index) => {
    newData["foo_"+(index+1)] = value
})

Вот более общий способ сделать это, вВ случае, если ваши данные более изменчивы.Это просто перебирает все ключи в исходном объекте и либо выравнивает их, как в вашем примере, если они являются массивами, либо копирует их напрямую, если это не так.

function flattenKeys (data) {
    let newData = {}

    Object.keys(data).forEach(key => 
        if (Array.isArray(data[key])) {
            data[key].forEach((value, index) => {
                // build a new set of keys based on the name of the original
                newData[key + "_" + (index+1)] = value
            })
        } else {
            newData[key] = data[key]
        }
    }

    return newData
}
...