【发布时间】:2017-11-13 02:13:30
【问题描述】:
我有一个包含 1500 个 varint 字符串的数组,如下所示:
var base = ["129;176;2","131;173;2","242;1","221;188;2","138;7","201;20","251;12","32"]
数组的字符串可以由单个数字(“32”)、两个数字(“242;1”)或三个数字(“131;173;2”)组成,不超过3个数字。
还有一个变量,其中包含从数组中包含的字符串的串联获得的字符串(该变量由用户创建,并且只能从可以在基本数组中找到的值列表中创建)。
var userCreated = "129;176;2;32;131;173;2;184;3;201;20;251;12"
问题是在数组中找到完美匹配,但我不知道要检查的正确部分。
例如: 我不知道我是否必须匹配“129”或“129;176”或“129;176;2”,所以我需要一个可以匹配第一个数字,第一个和第二个数字,以及第一个的函数,第二个和第三个数字。当找到完美匹配时,必须将字符串的一部分存储在新变量中并从原始变量(userCreated)中删除。
一个数字我就可以做到:
var divide = userCreated.split(";");
for (var i = 0;i<divide.length; i++){
if(base.indexOf(divide[i]) >= 0){
var found + i = divide[i];
}
}
是否可以按顺序检查 var 中的字符串与数组以找到完美匹配,然后检查字符串的其余部分?重要的是要注意:匹配可以在“完美匹配”之前找到(检查“129”可以找到匹配,但在基本数组中可以有一个“129;176”(完美匹配)所以其他值可能不匹配...
编辑: 为了澄清这个问题: userCreated 字符串不能包含两次要在数组中匹配的值。例如:它可以包含 126;15 和 126;15;2 但不能包含 126;15 或 126;15;2 两次。 预期的结果可以是一系列变量,里面每个“完美匹配”,例如:
var found0 = "129;176;2";
var found1 = "242;1";
var found2 = "32";
或者像原始数组这样的数组:
var found = ["129;176;2", "242;1", "32"] // Maybe a better solution
总匹配数在 1 到 30 匹配范围内。
编辑(解决方案): 在接受(和好的)答案之后,我尝试遵循类似的方式: 我已将原始数组拆分为 3 个数组,如下所示:
base1 = ["28", "34", "16"];
base2 = ["125;16", "200;45", "167;2"];
base3 = ["209;145;2", "143;154;2", "211;170;2", "246;170;2", "247;170;2"];
然后:
var divide = userCreated.split(";"),
resultArray3 = [], resultArray2 = [], resultArray1 = [], final = [];
function tri(divide){
for (var i = 0, j = 1, k = 2; k<divide.length; i++, j++, k++){
var tre = base3.indexOf(divide[i]+';'+divide[j]+';'divide[k]);
if (tre !== -1){
resultArray3.push(base3[tre]);
divide.splice(i, 1, "none");
divide.splice(j, 1, "none");
divide.splice(k, 1, "none");
}
}
}
function two(divide){
for (var i = 0, k = 1; k<divide.length; i++, k++){
var due = base2.indexOf(divide[i]+';'+divide[k]);
if (due !== -1){
resultArray2.push(base2[due]);
divide.splice(i, 1, "none");
divide.splice(k, 1, "none");
}
}
}
function ones(divide){
for (var k = 0; k<divide.length; k++){
var uno = base1.indexOf(divide[k]);
if (uno !== -1){
resultArray1.push(base1[uno]);
divide.splice(k, 1, "none");
}
}
}
最后:
final.push.apply(final, resultArray1);
final.push.apply(final, resultArray2);
final.push.apply(final, resultArray3);
【问题讨论】:
-
在
129;176;2;,你怎么可能知道它是否等同于129;176; 2;或129; 176;2;?您的分隔符与应合并的数字指示符相同。 -
那么,
var found = base.filter(item => ~`;${userCreated};`.indexOf(`;${item};`))有用吗? -
您能否从您的示例值中指定所需的结果
-
@ObsidianAge 两个变量中的分隔符都可以更改,挑战是在这种情况下找到完全匹配,知道吗?
-
这不适用于输入
"1;2;3;4"和base=["1", "2", "3;4"; "1;2;3"]。正确的解决方案是 ["1", "2", "3;4"],但是如果您从处理三元组开始,您会找到"1;2;3"并以 "4" 结尾,它没有匹配项。
标签: javascript arrays match