Динамически сопоставить массив с вложенным объектом

1

Я хочу получить содержимое формы на отправке и отобразить эти данные в объект.

let userData = $(e.currentTarget).serializeArray();
let userDataObject = this.serializedToObject(userData);

- Объекты шаблонов для отправки через POST

serializedToObject(serializedArray) {
        let templateObject = {
            privider: '',
            pop3: {
                host: '',
                port: 110,
                ssl: false
            },
            imap: {
                host: '',
                port: 993
            },

            email: '',
            password: ''
        };

        for (let data in serializedArray) {
        }

        return templateObject;
    }

- Форма userData - это

[Object, Object, Object, Object, Object, Object, Object]

- Пока объект имеет форму

Object: {
  name: 'provider',
  value: 'Aladin'
}

Object: {
  name: 'imap-host',
  value: '955'
}

Object: {
  name: 'imap-port',
  value: 
}


Object: {
  email: '[email protected]',
  value: 
}

Поэтому мне нужна помощь для сопоставления этого массива объектов с объектом templateObject. AnyHelp будет высоко оценен.

Обновить

[{"name":"name","value":"Nicholas Barbaros"},{"name":"email","value":"[email protected]"},{"name":"password","value":"nicu121-mujik"},{"name":"imap","value":"imap.server.com"},{"name":"imap-port","value":"ad"},{"name":"pop3-host","value":"pop.server.com"},{"name":"pop3-port","value":"465"}, {"name":"pop3-ssl","value":"false"}]
Теги:
object
arrays
dictionary
indexof

3 ответа

2
Лучший ответ

Свойство name каждого объекта serializedArray имеет минус-символ (-), представляющий вложенные объекты, вы можете разделить эти символы, а затем установить значения свойств templateObject:

var serializedArray = [{"name":"name","value":"Nicholas Barbaros"},{"name":"email","value":"[email protected]"},{"name":"password","value":"nicu121-mujik"},{"name":"imap","value":"imap.server.com"},{"name":"imap-port","value":"ad"},{"name":"pop3-host","value":"pop.server.com"},{"name":"pop3-port","value":"465"}, {"name":"pop3-ssl","value":"false"}];

// your defaults
var templateObject = {
    provider: '',
    pop3: {
        host: '',
        port: 110,
        ssl: false
    },
    imap: {
        host: '',
        port: 993
    },
    email: '',
    password: '',
};

serializedArray.forEach(function(obj) {
    var deep = obj.name.split('-');
    var key = deep.pop();

    var level = templateObject;
    deep.forEach(function(inner) {
        var nested = level[inner];
        var isObject = Object(nested) === nested;
        level = isObject ? nested : {};
    });

    level[key] = obj.value;
});

// return templateObject; // when inside your function
console.log(templateObject);
  • 0
    не совсем, мой templateObject вложен, так что это не сработает
  • 0
    @Nicholas. Я обновил свой ответ
Показать ещё 8 комментариев
0

Слишком много накладных расходов, чтобы перебрать сериализованный массив и сопоставить его с вложенным объектом.

Пожалуйста, рассмотрите этот подход, который является менее сложным:

let userData = new FormData($(e.currentTarget)[0]);
let userDataObject = serializedToObject(userData);

function serializedToObject(data) {
    return {
        provider: data.get('provider'),
        pop3: {
            host: data.get('pop3-host'),
            port: data.get('pop3-port'),
            ssl:  data.get('pop3-ssl')
        },
        imap: {
            host: data.get('imap-host'),
            port: data.get('imap-port')
        },

        email: data.get('email'),
        password: data.get('password')
    };
}

Я угадал некоторые поля здесь. При необходимости исправьте их.

0

Вы также можете использовать метод уменьшения, более функциональным способом

const array = [{
  name: 'provider',
  value: 'Aladin'
},{
  name: 'imap-host',
  value: '955'
},{
  name: 'imap-port',
  value: 'something'
}];

const newObject = array.reduce( (acc, item, {}) => {
  acc[item.name] = item.value;
  return acc;
})

console.log(newObject);

Ссылка на скрипку: https://jsfiddle.net/y5xkddnn/

  • 0
    не совсем, мой templateObject вложен, так что это не сработает
  • 0
    Таким образом, вы можете адаптировать код для использования некоторой рекурсивности ;-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню