Мне нужно взять строку из текстового ввода и преобразовать ее из массива в объект 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"}]
Я не совсем уверен, как это сделать для каждого цикла. Кто-нибудь может пролить свет?
ищите array.splice
По какой причине вы должны использовать именно цикл forEach вместо обычного цикла for?
@ mr.void Как в этом случае может помочь сплайсинг?
@WookieCoder, я думаю, это удобнее, чем цикл for в старом стиле
@ mr.void строка объединяется в массив. Однако показалось излишним включать его в пример кода.
@ bugwheels94 с помощью splice вы можете выбрать первые два элемента, пока array.length> 0.
@WookieCoder, честно говоря, я видел пример, который пытался использовать, который реализовывал forEach. Я думаю, что я собираюсь попробовать вместо этого цикл for



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это не идеальный способ создания объекта, но вы можете пропустить ключ, создать объект с ключом / значением, используя текущий индекс (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);Спасибо, проблема была на моей стороне. Это прекрасно работает.
Быстрый вопрос: если бы я хотел использовать вместо этого {"key1": "value1", "key2": "value2", "key3": "value3"}, как бы мне изменить код? Я также заметил "" вокруг скобок массива, как мне их удалить?
Это должно дать вам объект - if (i % 2) obj[a[i - 1]] = v;. Я не совсем понимаю, что вы имеете в виду, говоря о скобках.
Позже я фактически преобразовал объект в строку в своем коде, так что проблема была в этом. Спасибо за вашу помощь!
Вы можете использовать простой цикл 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)
Почему бы вам не использовать цикл for с шагом 2 за итерацию?