Как получить массив из нескольких подстрок, разделенных одной и той же строкой/символом/тегом в Javascript

У меня есть строка, состоящая из разных элементов, и мне нужно разделить их по другому тегу в строке.

Я использовал .split() и .pop(), которые отлично работали, если есть только один элемент.

function getText(fullText, type) {

    var partial = fullText.split('*' + type + '*').pop().split('*/' + type + '*')[0] || 'unknown';
    return partial;
}

var str = "*a*Substring A*/a**b*Substring B*/b**c*Substring C*/c*"

getText(str, a)  // returns 'Substring A'

Однако теперь я столкнулся с несколькими элементами, и в этом случае он возвращает только последний элемент.


var str = "*a*Substring A*/a**b*Substring B1*/b**b*Substring B2*/b*"

getText(str, b)  // returns 'Substring B2'

Как мне получить массив со всеми подстроками между этими тегами?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
94
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Вы можете использовать shift() для удаления первого элемента, а затем использовать map()

function getText(fullText, type) {

    var partial = fullText.split('*' + type + '*') 
    partial.shift();
    for(let i = 0;i<partial.length;i++){
      partial[i] = partial[i].split('*/' + type + '*')[0]
    }
    return partial
}

var str = "*a*Substring A*/a**b*Substring B1*/b**b*Substring B2*/b*"

console.info(getText(str, 'b'))

это тоже выглядит аккуратно, но, как я уже упоминал в другом комментарии, я использую jsx с indesign, чтобы быть точным, и похоже, что он не поддерживает карту es6s, поскольку возвращает «Строка ошибки: > не имеет значения», могу ли я сделать это по-другому?

Gabriel Roda Eugen Bach 27.04.2019 13:05

@GabrielRodaEugenBach Поддерживает ли он forEach()?

Maheer Ali 27.04.2019 14:51

@GabrielRodaEugenBach Я заменил map() на цикл for. Обязательно проверьте это.

Maheer Ali 27.04.2019 14:54

function getText(fullText, type) {
    let re = `\\*${type}\\*(.*?)\\*/${type}\\*`;
    return fullText
      .match(new RegExp(re, 'g'))
      .map(str => str.match(new RegExp(re))[1]);
}

var str = "*a*Substring A*/a* woah *a*Substring A 2*/a*"

x = getText(str, 'a') 

console.info(x)

RegExp хорош для этого решения +1.

Maheer Ali 26.04.2019 17:23

это элегантное решение, но, если быть точным, я использую jsx с indesign, и похоже, что он не поддерживает карту es6s, поскольку возвращает «Строка ошибки: > не имеет значения», могу ли я сделать это по-другому?

Gabriel Roda Eugen Bach 27.04.2019 13:05
map — это просто синтаксический сахар для традиционного цикла for. Вы можете заменить его таким. например for (let i = 0; i < fullText.length; i++) fullText[i] = str.match(...);
junvar 27.04.2019 19:16

Причина, по которой вы получаете последний элемент, заключается в том, что вы используете pop(), который просто возвращает последний элемент в массиве:

The pop() method removes the last element from an array and returns that element. This method changes the length of the array.

Подробнее об этом можно прочитать на сайте здесь.

Вот один из способов сделать это.

function getText(fullText, type) {
    var typeStr = "\*" + type + "\*";
    return fullText
        .split('/')
        .filter(item=>item.match(typeStr.replace(/\*/g, '\\*')))
        .map(item=>item
            .substr(item.indexOf(typeStr) + typeStr.length)
            .replace(/\*$/, ''));
}

var str = "*a*Substring A*/a**b*Substring B*/b**c*Substring C*/c*"

console.info(getText(str, 'a'));  // returns 'Substring A'

var str = "*a*Substring A*/a**b*Substring B1*/b**b*Substring B2*/b*"

console.info(getText(str, 'b'));  // returns 'Substring B2'

Объясняя:

// this creates a str with the type to be searched
var typeStr = "\*" + type + "\*";
return fullText
    // this splits all elements in your string
    .split('/')
    // this leaves only elements that match type...
    .filter(item=>item.match(
        // using a regex created with the typeStr created above
        // replace escape the * char to make regex work
        typeStr.replace(/\*/g, '\\*')))
    // now with the remaining parts, alter them as follows...        
    .map(item=>item
        // remove everything before type and type itself
        .substr(item.indexOf(typeStr) + typeStr.length)
        // remove last * char
        .replace(/\*$/, ''));

РЕДАКТИРОВАТЬ

Читая ответ @junvar, я заметил закономерность, которую не заметил, когда отвечал. Что если вы замените * на < или > у вас есть шаблон XML. Так что мне кажется, что OP заменил < и > на *, чтобы замаскировать это синтаксический анализ XML. Если это анализ XML, прочитайте самый известный ответ в SO:

https://stackoverflow.com/a/1732454/2752520

ПРОСТО НЕ ИСПОЛЬЗУЙТЕ XML С ПОМОЩЬЮ REGEX.

Использование pop() возвращает последний элемент в массиве (массив, созданный при первом разделении)

пытаться:

function getText(fullText, type) {
        var partial = fullText.split('*' + type + '*');
        var result = [];
            $.each(partial, function(i, item) {
                 var split = item.split('*/' + type + '*');
                 if (split.length > 1) {
                      result.push(split[0]);
                 }
            });
             return result;
        }
        var str = "*a*Substring A*/a**b*Substring B1*/b**b*Substring B2*/b*";
        console.info(getText(str, 'b'));

Другие вопросы по теме