根据值中的第一个字符将数组分成多个数组

Posted

技术标签:

【中文标题】根据值中的第一个字符将数组分成多个数组【英文标题】:Break array into multiple arrays based on first character in values 【发布时间】:2016-02-20 13:30:48 【问题描述】:

我有以下 javascript 数组:

var data = ["2_000001", "1_000001", "2_000002", "1_000002", "1_000003", "2_000003", "2_000004", "1_000004", "1_000005", "2_000005"]

我怎样才能像这样创建 2 个新数组(或者更多,如果有更多元素,例如 3_ 或 4_ 作为标识符):

var 2 = ["2_000001", "2_000002", "2_000003", "2_000004", "2_000005"]
var 1 = ["1_000001", "1_000002", "1_000003", "1_000004", "1_000005"]

到目前为止:

data.forEach(function (str) 

    str_api = str.substring(0, str.indexOf('_'));
    console.log(str_api);
    a_api.push(str_api);
    clean_api = $.unique(a_api);

    str_id = str.substring(str.indexOf("_") + 1);
    console.log(str_id);

);

它还没有真正接近目标。欢迎任何帮助!

【问题讨论】:

如果您尝试使用数字作为标识符,您将会遇到非常糟糕的情况,如果您需要索引,请考虑使用 ArrayObject 【参考方案1】:

使用箭头函数

var obj = ;
data.forEach((e, i) => (i = parseInt(e, 10), obj[i] ? obj[i].push(e) : (obj[i] = [e])));

obj;
/* 
    "1": ["1_000001","1_000002","1_000003","1_000004","1_000005"],
    "2": ["2_000001","2_000002","2_000003","2_000004","2_000005"]
 */
(e, i) => expr 是一个函数,它接受两个参数,ei(这里我们只需要 i 作用域) (expr1, expr2) 是两个使用逗号运算符 , 的表达式

expr1 ? expr2 : expr3 表示如果expr1为真,则为expr2,否则为expr3

parseInt 将为我们截断,因为_ 是无效的数字字符

arr.forEach 将函数应用于 Array

中的每个项目

【讨论】:

【参考方案2】:

随时随地生成变量不是一个好主意,因此请使用ObjectMulti Dimensional Array

    var data = ["2_000001", "1_000001", "2_000002", "1_000002", "1_000003", "2_000003", "2_000004", "1_000004", "1_000005", "2_000005"];

    var arr = ;

    // Loop through array
    [].forEach.call(data, function(inst)

        var x = inst.split("_")[0];

        // Check if arr already has an index x, if yes then push
        if(arr.hasOwnProperty(x)) 
            arr[x].push(inst);

        // Or else create a new one with inst as the first element.
        else 
            arr[x] = [inst];


    );

代码解释写成cmets。

这将导致


    "2": ["2_000001", "2_000002", "2_000003", "2_000004", "2_000005"],

    "1": ["1_000001", "1_000002", "1_000003", "1_000004", "1_000005"]

你可以随心所欲地使用它。

【讨论】:

你为什么.call在一个Array ([].forEach.call(foo, bar)) 上使用一个Array 方法而不是正常地通过自身调用(foo.forEach(bar) )?【参考方案3】:

这将创建一个具有您想要的属性和值的对象。

var data = ["2_000001", "1_000001", "2_000002", "1_000002", "1_000003", "2_000003", "2_000004", "1_000004", "1_000005", "2_000005"];

// Initialize a new object
var arrays = ;

// Loop over data
data.forEach(function (str) 

    // Get id piece
    str_api = str.substring(0, str.indexOf('_') + 1);

    // check if existing property for this id, if not initialize new array
    if (!arrays[str_api]) 
        arrays[str_api] = [];
    

    // get value piece
    str_id = str.substring(str.indexOf("_") + 1);

    // add to that id's array
    arrays[str_api].push(str_id);

);

console.log(arrays);

小提琴:http://jsfiddle.net/AtheistP3ace/6e2bLgf5/

输出:


    2_: ["000001", "000002", "000003", "000004", "000005"],
    1_: ["000001", "000002", "000003", "000004", "000005"]

编辑:不确定是否要在属性名称中使用下划线。在您的描述中,您给出 3_ 4_ 作为示例,但在代码示例中,您给出 1 2。

【讨论】:

以上是关于根据值中的第一个字符将数组分成多个数组的主要内容,如果未能解决你的问题,请参考以下文章

根据字符串属性按字母顺序对对象数组进行排序

【JS】数组对象自定义排序

使用猫鼬模式将多个选择元素值中的值存储到MongoDB中的数组中

java 如何将一个字符串数组每行的第一个英文字母变成大写

如何根据解析的第一个数字对字符串数组进行排序

java - 拆分字符串后,数组中的第一个元素是啥?