根据值中的第一个字符将数组分成多个数组
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);
);
它还没有真正接近目标。欢迎任何帮助!
【问题讨论】:
如果您尝试使用数字作为标识符,您将会遇到非常糟糕的情况,如果您需要索引,请考虑使用 Array 或 Object 【参考方案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
是一个函数,它接受两个参数,e
和 i
(这里我们只需要 i
作用域)
(expr1, expr2)
是两个使用逗号运算符 ,
的表达式
expr1 ? expr2 : expr3
表示如果expr1
为真,则为expr2
,否则为expr3
parseInt
将为我们截断,因为_
是无效的数字字符
arr.forEach
将函数应用于 Array
【讨论】:
【参考方案2】:随时随地生成变量不是一个好主意,因此请使用Object
或Multi 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。
【讨论】:
以上是关于根据值中的第一个字符将数组分成多个数组的主要内容,如果未能解决你的问题,请参考以下文章