Есть ли метод Javascript, который позволит объединить вложенные скобки? - PullRequest
1 голос
/ 26 июня 2019

Я пытаюсь создать строку из ввода, но отформатирован уникальным способом.

Входными данными будут отдельные слова: word1

Строка будет пустой до тех пор, пока не поступит первый ввод, тогда строка myString будет +(-word1).

Для второго ввода: word2, myString теперь должно выглядеть так:

    +(-word1+(-word2))

Для ясности третий вход: word3, myString теперь будет:

    +(-word1+(-word2+(-word3)))

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

Существует ли встроенная функция Javascript (или, возможно, JQuery), которая может выполнить создание строки, подобной этой?

Вот что я сделал

    var myString = '';

    function someFunction()
    { 
     ...

      var inputString = document.getElementById('my-input').value;
      myString = myString + "+(" + "-" + inputString + ")";
    }

Однако это производит

    +(-word1)+(-word2)

Это имеет смысл, потому что строки просто конкатенируются в функции, что должно произойти, скорее, является своего рода вставкой. Есть ли метод Javascript, который может сделать эту вставку проще? Возможно, что-то наподобие вставки новой строки со второго по последний пробел текущей строки? Однако это не массив, поэтому я не знаю лучших практик здесь.

Ответы [ 5 ]

2 голосов
/ 26 июня 2019

Не уверен, что это самый красивый способ сделать это, но вы можете использовать карту в списке слов ....

const words = ['word1', 'word2', 'word3']

let result = '+' + words.map(w => `(-${w}+`).join('').replace(/\+$/, '') + ''.padStart(words.length, ')')

console.log(result)
1 голос
/ 27 июня 2019

Ах, но вы видите, нормальная конкатенация строк может быть действительно умной.

Быстро и грязно, все, что вам нужно было сделать, это поместить +(- между каждым и добавить последние скобки. Хехе ...

arr = ['word1', 'word2', 'word3' ];
console.log( '+(-' + arr.join('+(-') + ')'.repeat(arr.length) );

В качестве альтернативы используйте .map

arr = ['word1', 'word2', 'word3' ];

console.log(
  arr.map( (e) => `+(-${e}` ) +
  ')'.repeat(arr.length)
);
1 голос
/ 26 июня 2019

Метод Array.reduceRight () хорошо подходит для этой проблемы, если вы можете сохранить последовательные входные данные в массиве:

const words = ['word1', 'word2', 'word3'];

let res = words.reduceRight((s, word) => `+(-${word}${s})`, "");

console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
1 голос
/ 26 июня 2019

Вы ищете первый закрывающий парентез и заменяете значение.

const insert = (s, v) => s ? s.replace(/(?=\))/, `+(-${v})`) : `+(-${v})`;

console.log(['word1', 'word2', 'word3'].reduce(insert, undefined));
0 голосов
/ 26 июня 2019

используйте переменную count для хранения количества добавленных слов, затем разделите строку до точки, в которой остаются только закрывающие скобки.

введите новое слово

добавьте оставшуюся строку

var myString = '';
var count = 0
    function someFunction()
    { 
     ...
      count++;
      var inputString = document.getElementById('my-input').value;
      myString = myString.slice(0,0-count) + "+(" + "-" + inputString + ")" + myString.slice(0-count);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...