Избегайте строки «null», используя метод разделения javascript

#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>