разнесите строку с другим оператором

#javascript #arrays #string #algorithm

#javascript #массивы #строка #алгоритм

Вопрос:

Возможно ли разнести строку с другим оператором?

Мне нужно, чтобы каждый код (разных размеров) пронумеровал [ ]

это пример всех различных возможностей в enter :

 const codes = [
   '[5018902847][592][50189272809][5089113805]',
   '[3898]',
   '[375001833][3475001021]',
    '',
]
  

и что мне нужно:

 [5018902847, 592, 50189272809, 5089113805]
[3898]
[375001833, 3475001021]
null // because code is empty
  

Мое первое решение, это что-то вроде этого :

 codes.map(code => {
    const res = code.split('[ '| '][' | ']');
    console.log(res)
})
  

но примером результата является :

 [
  ' [5',
  '51889',
  '28475][5',
  '51889424192][5',
  '518892728',
  '9][5',
  '518891138',
  '5]'
]
  

Комментарии:

1. «но примером результата является …» console.log('[ '| '][' | ']') расскажет вам, почему

2. На самом деле я не понимаю, почему существует что-то вроде [5 alone, например

3. Просто сделайте то, что я предложил в своем первом комментарии. Каков результат и для чего ваш аргумент .split() ?

4. codes.map(code => code.match(/d /g))

5. @Andreas хорошо, спасибо, код возвращает 0, я не знал

Ответ №1:

Вы могли бы использовать String.prototype.match()

 const codes = [
  "[5018902847][592][50189272809][5089113805]",
  "[3898]",
  "[375001833][3475001021]",
  "",
]

const res = codes.map((code) => {
  const extracted = code.match(/d /g)
  return extracted amp;amp; extracted.map(Number)
})

console.log(res)  

Ответ №2:

Вы можете определить разделитель регулярных выражений :

 > '[5018902847][592][50189272809][5089113805]'.split(/[[]]/)
[
  '',
  '5018902847',
  '',
  '592',
  '',
  '50189272809',
  '',
  '5089113805',
  ''
]
  

Чтобы преобразовать ваш codes массив в желаемый формат, вот классный однострочный :

 const codes = [
   '[5018902847][592][50189272809][5089113805]',
   '[3898]',
   '[375001833][3475001021]',
    '',
]
const cleanedCodes = codes.map(code => code.split(/[[]]/).filter(s => s.length)).filter(a => a.length)
console.log(cleanedCodes);
/*
 * will output : [
 *  [ '5018902847', '592', '50189272809', '5089113805' ],
 *  [ '3898' ],
 *  [ '375001833', '3475001021' ]
 * ]
 *
 */

  

Ответ №3:

Вы также можете сделать это без match (из ответа @hgb123).

 const codes = [
  "[5018902847][592][50189272809][5089113805]",
  "[3898]",
  "[375001833][3475001021]",
  "",
]

const res = codes.map((code) => {
  var extracted = code.split(']').filter(Boolean).map(x => {return x.replace("[","");})
  return extracted amp;amp; extracted.map(Number)
})

console.log(res)