Как разбить строку на несколько массивов на основе нескольких разделителей в javascript - PullRequest
0 голосов
/ 06 января 2020

Я видел вопросы, но ни один из них не помог мне. У меня есть такая строка:

var Lang_Array1 = "HU, бла, бла, бла, EN, бла, бла, бла, бла, DE, бла, бла, бла, RO, бла, бла, бла ";

Я хочу, чтобы эта строка находилась в разных массивах на основе разделителей " HU "," EN "," DE "," RO ".

Мой подход в настоящее время таков: ( Работает, но не слишком элегантно ):

var Lang_Array1 = Lang_Array.split(",");
    console.log(typeof(Lang_Array));
    console.log(Lang_Array);

    var HU_Langs = [];
    var EN_Langs = [];
    var DE_Langs = [];
    var RO_Langs = [];

    for(var i = 0; i < Lang_Array1.length;i++){
        if(Lang_Array1[i] != "EN"){
            if(Lang_Array1[i] != ""){
                HU_Langs[i] = Lang_Array1[i];
            }
        }else{
            for(i;i < Lang_Array1.length;i++){
                if(Lang_Array1[i] != "DE"){
                    if(Lang_Array1[i] != ""){
                        EN_Langs[i] = Lang_Array1[i];
                    }
                }else{
                    for(i;i < Lang_Array1.length;i++){
                        if(Lang_Array1[i] != "RO"){
                            if(Lang_Array1[i] != ""){
                                DE_Langs[i] = Lang_Array1[i];
                            }
                        }else{
                            for(i;i < Lang_Array1.length;i++){
                                    if(Lang_Array1[i] != ""){
                                        RO_Langs[i] = Lang_Array1[i];
                                    }       
                                }
                            break;
                        }
                    }
                    break;
                }
            }
            break;
        }
    }

Таким образом, я получаю то, что хочу, но хочу улучшить это как-то. Массивы:

HU_Langs =["HU","blah","blah","blah"];
EN_Langs =["EN","blah","blah","blah"];
DE_Langs =["DE","blah","blah","blah"];

et c ...

Так как я могу улучшить этот код без вложенных циклов?

РЕДАКТИРОВАТЬ : Спасибо за все! Все ответы очень, очень хорошие. Мой вопрос не был ясным и достаточно подробным, но я решил его с помощью правильного ответа.

Вот функция теперь:

function Get_Language_Object(Lang_Array){
    Lang_Array = Lang_Array.replace(/(\r\n|\n|\r)/gm, "");
    var langs = ['HU', 'EN', 'DE', 'RO'];
    var isLang = str => langs.includes(str);
    var { HU: New_HU_Langs, EN: New_EN_Langs, DE: New_DE_Langs, RO: New_RO_Langs } = Lang_Array.split(',')
        .reduce((r, str) => {
    if(isLang(str)) r.push([]);
        r[r.length - 1].push(str);
        return r;
    }, [])
        .reduce((r, [code, ...arr]) => ({ ...r, [code]: arr }), {});
    for(var i = 0; i < TAGS.length;i++){
        arrLang.HU[TAGS[i]] = New_HU_Langs[i];
        arrLang.EN[TAGS[i]] = New_EN_Langs[i];
        arrLang.DE[TAGS[i]] = New_DE_Langs[i];
        arrLang.RO[TAGS[i]] = New_RO_Langs[i];
    }
    Set_Actual_Language();
    VNotify("Settings Notfy","Lang Set!","success",1500,"success32.png");
}

Ответы [ 5 ]

3 голосов
/ 06 января 2020

Разбить строку по разделителю (,), уменьшить массив и для каждого кода языка добавить новый подмассив. Pu sh все элементы последнего подмассива:

var Lang_Array1 = "HU,blah,blah,blah,EN,blah,blah,blah,blah,DE,blah,blah,blah,RO,blah,blah,blah";

var langs = ['HU', 'EN', 'DE', 'RO'];

var isLang = str => langs.includes(str);

var result = Lang_Array1.split(',')
  .reduce((r, str) => {
    if(isLang(str)) r.push([]);
    
    r[r.length - 1].push(str);
  
    return r;
  }, []);
  
console.log(result);

Если вы хотите разделить несколько массивов, сократите вложенные массивы до объекта и используйте разветвление, чтобы назначить их переменным:

var Lang_Array1 = "HU,blah,blah,blah,EN,blah,blah,blah,blah,DE,blah,blah,blah,RO,blah,blah,blah";

var langs = ['HU', 'EN', 'DE', 'RO'];

var isLang = str => langs.includes(str);

var { HU: HU_Langs, EN: EN_Langs, DE: DE_langs, RO: RO_langs } = Lang_Array1.split(',')
  .reduce((r, str) => {
    if(isLang(str)) r.push([]);
    
    r[r.length - 1].push(str);
  
    return r;
  }, [])
  .reduce((r, [code, ...arr]) => ({ ...r, [code]: arr }), {});
  
console.log(HU_Langs, EN_Langs, DE_langs, RO_langs);
0 голосов
/ 06 января 2020

Временный массив может использоваться для ссылки на массив в pu sh to:

var Lang_Array = "HU,blah,blah,blah,EN,blah,blah,blah,blah,DE,blah,blah,blah,RO,blah,blah,blah";
var Lang_Array1 = Lang_Array.split(","), HU_Langs = [], EN_Langs = [], DE_Langs = [], RO_Langs = [];

for (var Langs = [], i = 0; i < Lang_Array1.length; i++)
{
  var str = Lang_Array1[i];

  Langs = { HU: HU_Langs, EN: EN_Langs, DE: DE_Langs, RO: RO_Langs }[str] || Langs;

  Langs.push(str);
}

console.log( HU_Langs, EN_Langs, DE_Langs, RO_Langs );
0 голосов
/ 06 января 2020

Если порядок постоянен:

var Lang_Array1 = "HU,blah1,blah2,blah3,EN,blah4,blah5,blah6,blah7,DE,blah8,blah9,blah10,RO,blah11,blah12,blah13";
const arr1 = Lang_Array1.split(/[HU,EN,DE,RO]/g);
let obj = {hu:[],en:[],de:[],ro:[]};
const keys = Object.keys(obj);
let i = 0;
arr1.forEach(el=>{
    if(el !== '')
      obj[ keys[i] ].push(el);
  else
    if(obj[ keys[i] ].length > 0)
      i++;
 });

console.log(obj);

Ответ:

{hu: Array(3), en: Array(4), de: Array(3), ro: Array(3)}
hu: (3) ["blah1", "blah2", "blah3"]
en: (4) ["blah4", "blah5", "blah6", "blah7"]
de: (3) ["blah8", "blah9", "blah10"]
ro: (3) ["blah11", "blah12", "blah13"]
0 голосов
/ 06 января 2020

Поскольку я считаю, что ISO2-код в верхнем регистре является подсказкой языка, вы можете сгруппировать все результаты более масштабируемым образом.

var Lang_Array1 = "HU,blah,blah,blah,EN,blah,blah,blah,blah,DE,blah,blah,blah,RO,blah,blah,blah";
var Languages = {};
var current = '';

Lang_Array1.split(',').forEach(function (value) {
  if (/^[A-Z]{2}$/.test(value))
    current = value;
  else
    Languages[current] = (Languages[current] || []).concat(value);
});

console.log(Languages);

Приведенный выше фрагмент будет заполнять объект Languages следующим образом:

{
  "HU": [
    "blah",
    "blah",
    "blah"
  ],
  "EN": [
    "blah",
    "blah",
    "blah",
    "blah"
  ],
  "DE": [
    "blah",
    "blah",
    "blah"
  ],
  "RO": [
    "blah",
    "blah",
    "blah"
  ]
}

На данный момент все, что вам нужно сделать, это обратиться непосредственно к Languages.EN или другим лицам или воссоздать исходную структуру с помощью:

var Lang_Array = Object.keys(Languages).reduce(
  function (arr, key) {
    return arr.concat(key, Languages[key]);
  },
  []
);

Вы также можете создавать массивы с помощью язык, начинающийся с индекса 0, и следующие значения:

var Lang_EN = ['EN'].concat(Languages.EN);

Как итог, группировка по ключам представляется наилучшим способом представления и обработки такой уплощенной структуры.

Надеюсь, это помогло ?

0 голосов
/ 06 января 2020

Вы должны уменьшить список слов после разделения на разделитель (,). Каждый раз, когда вы сталкиваетесь с известным ключом, вы изменяете key, который ссылается на текущий язык.

Это самый краткий пример:

let arr = "HU,blaf,blaf,blaf,EN,blah,blah,blah,blah,DE,bla,bla,bla,RO,bah,bah,bah"
let keys = [ "DE", "EN", "HU", "RO" ]
let dict = langDict(arr, keys)

console.log(dict)

function langDict(arr, keys) {
  let key = null
  return arr.split(/,/g).reduce((dict, token) => {
    if (Object.keys(dict).length && key == null) {
      throw new Error('No language defined yet!')
    } else if (keys.includes(token)) {
      key = token
    } else {
      if (dict[key] == null) dict[key] = []
      dict[key].push(token)
    }
    return dict
  }, {})
}
.as-console-wrapper { top: 0; max-height: 100% !important; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...