Преобразование многомерного массива в определенный строковый формат

#javascript #arrays #stringify

#javascript #массивы #stringify

Вопрос:

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

Это массив:

 formdata: [
    1: {name: "gender", value: "F", focus: 0, type: "radio"}
    2: {name: "firstname", value: "empty", focus: 0, type: "input"}
    3: {name: "lastname", value: "empty", focus: 0, type: "input"}
    4: {name: "birthday", value: "empty", focus: 0, type: "input"}
    5: {name: "street", value: "empty", focus: 0, type: "input"}
    6: {name: "streetNo", value: "empty", focus: 0, type: "input"}
]
  

И это конкретный строковый формат, в который он должен быть преобразован:

 let formdata = gender.radio|F|0;firstName.text|empty|1;lastName.text|empty|0;street.text|empty|0;houseNumber.text|empty|0;zip.text|empty|0;city.text|empty|0;country.select-one|de|0;birthdate-day.text|empty|0;birthdate-month.text|empty|0;birthdate-year.text|empty|0;email.email|empty|0;code.text|filled_out|0
  

Я предполагаю, что лучше всего использовать JSON.stringify. Я попробовал несколько вариантов в соответствии с этим:

 let formdata = JSON.stringify(
formdata: [
    1: {name: "gender", value: "F", focus: 0, type: "radio"}
    2: {name: "firstname", value: "empty", focus: 0, type: "text"}
    3: {name: "lastname", value: "empty", focus: 0, type: "text"}
    4: {name: "birthday", value: "empty", focus: 0, type: "text"}
    5: {name: "street", value: "empty", focus: 0, type: "text"}
    6: {name: "streetNo", value: "empty", focus: 0, type: "text"}
])
.replace(/(]],)[/g, "]n")..replace(/([[|]]|")/g,"");
  

Ни один из них не сработал.

Есть идеи, как это решить?

Спасибо!

Ответ №1:

Я думаю, просто используйте map() для массива. И возвращает строку шаблона. А затем join() массив с помощью ';'

 const formdata = [
    {name: "gender", value: "F", focus: 0, type: "radio"},
    {name: "firstname", value: "empty", focus: 0, type: "input"},
    {name: "lastname", value: "empty", focus: 0, type: "input"},
    {name: "birthday", value: "empty", focus: 0, type: "input"},
    {name: "street", value: "empty", focus: 0, type: "input"},
    {name: "streetNo", value: "empty", focus: 0, type: "input"},
]


let res = formdata.map(({name,value,focus,type}) => `${name}.${type}|${value}|${focus}`).join(';')

console.log(res)  

Ответ №2:

Непонятно, о чем вы спрашиваете, поскольку ваши фрагменты кода не являются допустимым javascript.

Но учитывая массив

   let formData = [
    {name: "gender", value: "F", focus: 0, type: "radio"},
    {name: "firstname", value: "empty", focus: 0, type: "input"},
    {name: "lastname", value: "empty", focus: 0, type: "input"},
    {name: "birthday", value: "empty", focus: 0, type: "input"},
    {name: "street", value: "empty", focus: 0, type: "input"},
    {name: "streetNo", value: "empty", focus: 0, type: "input"},
  ];
  

Если вы хотите строку

 'gender.radio|F|0;firstName.text|empty|1;lastName.text|empty|0;street.text|empty|0;houseNumber.text|empty|0;zip.text|empty|0;city.text|empty|0;country.select-one|de|0;birthdate-day.text|empty|0;birthdate-month.text|empty|0;birthdate-year.text|empty|0;email.email|empty|0;code.text|filled_out|0'
  

Тогда это сработает:

 let formDataString = formData.map(({name, value, focus, type}) =>
    `${name}.${type}|${value}|${focus}`);
  

Комментарии:

1. Я не могу найти никакой разницы между моим и вашим кодом. и ваш результат не будет иметь ;

2. Разница в том, что ‘1’, ‘2’, … числа и использование двоеточия вместо equals; эти изменения предполагали, что ваш массив был строкой, которую вы хотели разобрать в массив.

Ответ №3:

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

 var array = [{ name: "gender", value: "F", focus: 0, type: "radio" }, { name: "firstname", value: "empty", focus: 0, type: "input" }, { name: "lastname", value: "empty", focus: 0, type: "input" }, { name: "birthday", value: "empty", focus: 0, type: "input" }, { name: "street", value: "empty", focus: 0, type: "input" }, { name: "streetNo", value: "empty", focus: 0, type: "input" }],
    keys = ['name', 'type', 'value', 'focus'],
    take = { type: { input: 'text' } },
    separators= '.||',
    string = array
        .map(o => keys
            .map((k, i) => (take[k] amp;amp; take[k][o[k]] || o[k])   (separators[i] || ''))
            .join('')
        )
        .join(';');

console.log(string);