Преобразование массива Javascript в определяемую пользователем пару ключ / значение JSON

Мне нужно взять строку из текстового ввода и преобразовать ее из массива в объект JSON.

let orderInputArray = ["key1", "value1", "key2", "value2"];
let json = {}
let key,value;

orderInputArray.forEach(function(keyValue) {
  json[key] = keyValue.value;
});

let orderInputJSON = JSON.stringify(orderInputArray);

Мне нужно, чтобы это выглядело так:

[{"key1": "value1"}, {"key2": "value2"}]

Я не совсем уверен, как это сделать для каждого цикла. Кто-нибудь может пролить свет?

Почему бы вам не использовать цикл for с шагом 2 за итерацию?

bugwheels94 08.10.2018 18:57

ищите array.splice

enno.void 08.10.2018 18:57

По какой причине вы должны использовать именно цикл forEach вместо обычного цикла for?

Ethan 08.10.2018 18:57

@ mr.void Как в этом случае может помочь сплайсинг?

bugwheels94 08.10.2018 18:58

@WookieCoder, я думаю, это удобнее, чем цикл for в старом стиле

enno.void 08.10.2018 18:58

@ mr.void строка объединяется в массив. Однако показалось излишним включать его в пример кода.

Stephen Ross 08.10.2018 18:58

@ bugwheels94 с помощью splice вы можете выбрать первые два элемента, пока array.length> 0.

enno.void 08.10.2018 19:00

@WookieCoder, честно говоря, я видел пример, который пытался использовать, который реализовывал forEach. Я думаю, что я собираюсь попробовать вместо этого цикл for

Stephen Ross 08.10.2018 19:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
8
1 488
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

Это не идеальный способ создания объекта, но вы можете пропустить ключ, создать объект с ключом / значением, используя текущий индекс (i), и подтолкнуть его к результату (orderInputObjects):

const orderInputArray = ["key1", "value1", "key2", "value2"];
const orderInputObjects = [];

orderInputArray.forEach(function(v, i, a) {
  if (i % 2) orderInputObjects.push({ [a[i - 1]]: v });
});

console.info(orderInputObjects);

Спасибо, проблема была на моей стороне. Это прекрасно работает.

Stephen Ross 08.10.2018 20:39

Быстрый вопрос: если бы я хотел использовать вместо этого {"key1": "value1", "key2": "value2", "key3": "value3"}, как бы мне изменить код? Я также заметил "" вокруг скобок массива, как мне их удалить?

Stephen Ross 08.10.2018 21:13

Это должно дать вам объект - if (i % 2) obj[a[i - 1]] = v;. Я не совсем понимаю, что вы имеете в виду, говоря о скобках.

Ori Drori 08.10.2018 22:17

Позже я фактически преобразовал объект в строку в своем коде, так что проблема была в этом. Спасибо за вашу помощь!

Stephen Ross 09.10.2018 15:57

Вы можете использовать простой цикл for и увеличить на 2 вместо 1

function arrayToKeyValue(array) {
  let updated = [];
  for (let i = 0; i < array.length; i += 2) {
    const key = array[i];
    const value = array[i + 1];
    updated.push({ key: value });
  }
  return updated;
}

forEach использует функцию обратного вызова, поэтому не гарантируется завершение до let orderInputJSON = JSON.stringify(orderInputArray); в вашем коде.

Попробуйте использовать

var i;

for (i =0; i < orderInputArray.length; i=i+2){
//create object here using orderInputArray[i] as key and orderInputArray[i+1] as value
}

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

let orderInputArray = ["key1", "value1", "key2", "value2"];
let vals = orderInputArray.filter(function(item, index) {
  return index % 2 === 1

});
let keys = orderInputArray.filter(function(item, index) {
  return index % 2 === 0

}).reduce(function(acc, curr, index) {
  acc.push({
    [curr]: vals[index]
  })
  return acc
}, []);
console.info(keys)

Вы также можете сделать это с помощью уменьшать

let orderInputArray = ["key1", "value1", "key2", "value2"];
var l = orderInputArray.length;
var jsobj = orderInputArray.reduce(function(acc, v, i) {
    var o = {};
    if (i % 2 === 0 && i < l - 1) {
        o[v] = orderInputArray[i + 1];
        acc.push(o)
    }
    return acc;
}, []);
console.info(JSON.stringify(jsobj))

Вот мое решение со сращиванием:

var fruits = ["Banana", "Orange", "Apple", "Mango"];

var json = {};
while(fruits.length > 0){
    let a = fruits.splice(0,2)
    console.info(a)
    json[a[0]] = a[1]
}

console.info(json)

let orderInputArray = ["key1", "value1", "key2", "value2"];
jsonArray = [];
orderInputArray.forEach((item, i, a)=> {if (i%2 === 0) jsonArray.push({item:a[i+1]})});

console.info(jsonArray)

Другие вопросы по теме