Почему создается пустой элемент в массиве?

Почему при использовании метода .split("\n") появляется пустой элемент в массиве Все действия, которые мне необходимо выполнить const textareaValue = output.value.split("\n").sort().join(" "); Было бы круто если бы еще подсказали как вывести новый результат на новых строках

"use strict";
window.addEventListener("DOMContentLoaded", () => {
  const add = document.querySelector("#add"),
    input1 = document.querySelector("#input-1"),
    output = document.querySelector("#output"),
    sortByName = document.querySelector("#sort-by-name");

  add.addEventListener("click", () => {
    const nameValue = input1.value;
    if (/^([a-zA-Z0-9' ']+=[a-zA-Z0-9' ']+)$/.test(nameValue)) {
      output.textContent += nameValue + "\n";
    } else {
      alert("Sorry, you can put only alpha-numeric characters");
    }
  });

  sortByName.addEventListener("click", () => {
    const textareaValue = output.value.split("\n");
    console.log(textareaValue);
    output.innerText += textareaValue;
  });
});
.items {
  margin: 0 auto;
  padding: 50px;
  list-style-type: none;
  max-width: 450px;
  display: grid;
  grid-template-columns: 75% 25%;
  justify-content: center;
  gap: 10px;
  color: #000000;
}

.title {
  margin: 0;
}

.items .item:nth-child(1) {
  grid-column: 1 / 3;
  grid-row: 1 / 2;
}

.items .item:nth-child(2) {
  grid-column: 1 / 2;
  grid-row: 2 / 3;
}

.items .item:nth-child(3) {
  grid-column: 2 / 3;
  grid-row: 2 / 3;
  align-self: end;
}

.items .item:nth-child(4) {
  grid-column: 1 / 2;
  grid-row: 3 / 4;
}

.items .item:nth-child(5) {
  margin-top: 17.6px;
  grid-column: 2 / 3;
  grid-row: 3 / 4;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

textarea {
  height: 200px;
  resize: none;
}

input,
textarea,
button {
  width: 90%;
  color: #000000;
  padding: 3px 5px;
  border-radius: 0;
  background-color: #ffffff;
  border: 1px solid #000000;
}

input:focus,
textarea:focus,
button:focus {
  outline: none;
}

button {
  width: max-content;
  cursor: pointer;
  background-color: rgb(243 238 238);
}
<ul class="items">
  <li class="item">
    <h1 class="title">Test</h1>
  </li>
  <li class="item">
    <label for="input-1">Name/Value Pair</label>
    <input type="text" id="input-1" name="input-1" placeholder="Name=Value" />
  </li>
  <li class="item">
    <button type="button" id="add">Add</button>
  </li>
  <li class="item">
    <label for="output">Name/Value Pair List</label>
    <textarea id="output" name="output"></textarea>
  </li>
  <li class="item">
    <button type="button" id="sort-by-name">Sort by Name</button>
    <button type="button">Sort by Value</button>
    <button type="button">Delete</button>
    <button type="button">Show XML</button>
  </li>
</ul>

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Алексей Шиманский

Ты добавляешь в textarea значения вот так:

output.textContent += nameValue + "\n";

Получается у тебя в конце есть доп. знак \n. Split разбивает строку по разделителю. Если можно так выразиться: он берет кусок слева от разделителя и справа от разделителя и помещает эти оба куска в массив. Это упрощённо для понимания. Так как после последнего \n ничего нет, метод берёт слева слово, а справа пустоту, потому что ему надо что-то взять слева и справа от разделителя.

Так что либо не добавляй в конце \n, добавляй его, например, перед очередной вставкой, либо обрезай его, каким-нибудь trim, т.е.

output.value.trim('\n').split("\n");
→ Ссылка