繁体   English   中英

如何根据javascript中的多个分隔符将字符串拆分为多个数组

[英]How to split a string to multiple arrays based on multiple separators in javascript

我已经看到了这些问题,但没有一个对我有帮助。 我有一个这样的字符串:

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

我希望该字符串基于分隔符"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"];

等等...

那么如何在没有嵌套 for 循环的情况下改进此代码?

编辑:谢谢大家! 所有的答案都非常非常好。 我的问题不够清楚和详细,但我在正确答案的帮助下解决了这个问题。

这是现在的功能:

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");
}

通过分隔符 ( , ) 拆分字符串,减少数组,并为每个语言代码添加一个新的子数组。 将所有项目推送到最后一个子数组:

 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);

在分隔符 ( , ) 上拆分后,您应该减少单词列表。 每次遇到已知键时,都会更改引用当前语言的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; }

因为我相信大写的 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);

总之,按键分组似乎是表示和操作这种扁平结构的最佳方式。

我希望这有帮助👋

如果顺序不变:

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"]

临时数组可用于引用要推送到的数组:

 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 );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM