#javascript #arrays #ecmascript-6 #javascript-objects #ecmascript-5
#javascript #массивы #ecmascript-6 #javascript-объекты #ecmascript-5
Вопрос:
Я пытаюсь проанализировать строку в следующем формате
"value1=name1:value2=test1,value1=name2:value2=null,value1=null:value2=test3"
Я бы хотел, чтобы это было проанализировано как
[{ value1: "name1", value2: "test1"}, { value1: "name2", value2: "NA"},{ value1: "NA", value2: "test3"}]
Если в случае, если какое-либо значение после разделения равно нулю, просто сделайте «NA». Поскольку я использую split
, значение null преобразуется в строку. Следовательно, установка «NA» с помощью nullish coalescing(??)
не работает и, следовательно, она по-прежнему возвращает null, а не NA. Также было бы полезно, если бы какой-либо орган мог предложить более простой способ достижения этого
Код, который я пробовал.
let input = "value1=name1:value2=test1,value1=name2:value2=null,value1=null:value2=test3";
let items = input.split(",");
let pairs = items.map((item) => {
let splitItems = item.split(":");
let value1 = splitItems[0].split("=")?? "NA";;
let value2 = splitItems[1].split("=") ?? "NA";
return { value1, value2 };
});
Комментарии:
1. Вы можете отфильтровывать совпадения, содержащие нулевые значения.
Ответ №1:
Вы могли бы использовать тернарный оператор
const str =
"value1=name1:value2=test1,value1=name2:value2=test2,value1=null:value2=test3"
const res = str.split(",").map((el) =>
el.split(":").reduce((acc, pair) => {
const [key, value = "NA"] = pair.split("=")
return {
...acc,
[key]: value === "null" ? "NA" : value,
}
}, {})
)
console.log(res)
Комментарии:
1. На случай, если я хочу, чтобы она анализировалась как { «someVal»: «name1», «SomeVal2»: «test1»}. вместо того, чтобы брать ключи из ввода, я хочу, чтобы в результате был другой?
2. @li97 затем вы можете изменить свойство по своему усмотрению, например
{ [buildKey(key)]: ... }
, и настроить ожидаемый ключ с помощью ключа, взятого из ввода
Ответ №2:
Вы можете попробовать использовать это:
(string || '').split("=") || "NA";
Комментарии:
1. Шаг 1. Мы заменяем null пустой строкой шаг 2. Мы выбрали разделенную строку или na
Ответ №3:
Как насчет использования Object.fromentries, поскольку ваше разделение показывает два значения в формате [],[].
let input = "value1=name1:value2=test1,value1=name2:value2=test2,value1=null:value2=test3";
let items = input.replace(/null/g, 'NA').split(",");
let pairs = items.map((item) => {
let splitItems = item.split(":");
let value5 = splitItems[0].split("=");
let value6 = splitItems[1].split("=");
return Object.fromEntries([value5,value6])
});
console.log(pairs)
Ответ №4:
возможно, это не более простой, но легкий и экономичный способ анализа вашей строки, и он достаточно универсален, чтобы предоставлять пары ключ-значение, сколько предусмотрено
const input = "value1=name1:value2=test1:value3=name3:value4=test4,value1=name2:value2=test2,value1=null:value2=test3";
const mappedKey = {
value3: 'someNewKey1',
value4: 'someNewKey2',
};
const parseData = (input) => {
// replace directly all null values before splitting
const stream = input.replace(/null/g, 'NA');
// now split by comma and equal sign
const parsedStream = stream.split(",").map((fragment) => {
// build a key value object, to be able to collect n value pairs
const obj = {};
// split groups by -> :
const values = fragment.split(':').map((split) => {
// split key value pairs by -> =
return split.split('=');
});
// collect the key value pais into obj
values.forEach((data) => {
const [key, value] = data;
obj[mappedKey[key] || key] = value;
});
// return the final result
return obj;
});
return parsedStream;
}
window.onload = () => {
document.querySelector('.input').innerHTML = input;
document.querySelector('.result').innerHTML = JSON.stringify(parseData(input), null, 2);
}
<h3>Input:</h3>
<pre class="input"></pre>
<hr />
<h3>Parsed result:</h3>
<pre class="result"></pre>