Javascript 将混合值的数组筛选到不同的数组
我有一个数组Javascript 将混合值的数组筛选到不同的数组,javascript,arrays,Javascript,Arrays,我有一个数组 arr = [1, 2, "a", "a1", "3", "qw7", "b", "4", "xyz", "abcd"] 我喜欢根据它的内容对它进行过滤,迭代每个查找它的字母字符还是数字,过滤出字母数字值以分离数组,数字以分离,字母以分离 out1 = [1, 2, 3, 4] out2= ["a",
arr = [1, 2, "a", "a1", "3", "qw7", "b", "4", "xyz", "abcd"]
我喜欢根据它的内容对它进行过滤,迭代每个查找它的字母字符还是数字,过滤出字母数字值以分离数组,数字以分离,字母以分离
out1 = [1, 2, 3, 4]
out2= ["a", "b", "x", "y", "z", "c", "d"]
out3= ["a1", "qw7"]
我可以做out1
,不能做out2
和out3
out1 = arr.filter(Number) // to get required output, [1, 2, 3, 4]
我试着用
arr.map( i=>{
if (i typeof string){
out2.push(i);
}
})
要过滤掉字母字符,可以使用:
constout2=[“a”、“b”、“x”、“y”、“z”、“c”、“d”和“1]
console.log(out2.filter(a=>a.toString().match(/^[a-Za-z]/))
您可以根据正则表达式对数组进行分组,包括数字、字符和字母数字
const arr=[1,2,“a”,“a1”,“3”,“qw7”,“b”,“4”,“xyz”,“abcd”],
结果=arr.reduce((r,v)=>{
if(字符串(v).match(/^\d+$/){
r、 数字推送(v);
}else if(v.length===1&&v.match(/[a-z]/i)){
r、 字符。推(v);
}否则{
r、 字母数字推送(v);
}
返回r;
},{数字:[],字符:[],字母数字:[]});
控制台日志(结果)代码>您可以检查类型并推送到想要的数组
const
数组=[1,2,“a”,“a1”,“3”,“qw7”,“b”,“4”,“xyz”,“abcd”],
结果=数组。减少((r,v)=>{
开关(真){
情况为有限(v):
r、 数字推送(+v);
打破
case/^[a-z]+$/i.test(v.toString()):
[…v.toString()].forEach(c=>{
如果(!r.字母表包括(c))r.字母表推(c);
});
打破
违约:
r、 杂项推送(v);
}
返回r;
},{数字:[],字母:[],杂项:[]});
控制台日志(结果)代码>
。作为控制台包装{max height:100%!important;top:0;}
您可以尝试以下方法:
var arr=[1,2,“a”,“a1”,“3”,“qw7”,“b”,“4”,“xyz”,“abcd”]
//使用map()将字符串编号转换为数字
var out1=arr.filter(Number).map(c=>Number(c));
控制台日志(out1);
//将flatMap()和split()与过滤器、regex test()和set一起使用
var out2=[…新集合(arr.filter(i=>/^[a-zA-Z]+$/.test(i)).flatMap(c=>c.split(“”));
控制台日志(out2);
//使用带有rezex测试()的过滤器
var out3=arr.filter(i=>/^[a-zA-Z]+\d+$/.test(i));
控制台日志(out3)代码>
const arr=[1,2,“a”,“a1”,“3”,“qw7”,“b”,“4”,“xyz”,“abcd”]
常数filterNumeric=(arr=[])=>
arr.filter(e=>/^[0-9]+$/.test(e));
常数filterAlphabetic=(arr=[])=>
新设置([。。。
arr.filter(e=>/^[A-Za-z]+$/.test(e)).flatMap(str=>str.split(“”))
]);
常量filterAlphaNumeric=(arr=[])=>
arr.filter(e=>/^[A-Za-z]+[0-9]+$/.test(e));
log(“数值:”,…过滤器数值(arr));
控制台日志(“字母:”,…filterAlphabetic(arr));
log(“alpa numeric:,…filterAlphaNumeric(arr))代码>您可以通过一个循环解决此问题,方法如下:
函数拆分类型(arr){
常量allChars=[]
常量allStrings=[]
常量allNums=[]
arr.forEach(项目=>{
如果(项目类型=='number'| |/^[0-9]+$/.test(项目)){
常数n=项目类型=='编号'?项目:编号(项目);
所有数值推送(n);
}否则如果(/^[A-Za-z]+$/.测试(项目)){
所有字符推送(…项分割(“”));
}否则{
allStrings.push(项目)
}
});
返回{
字符:[……新设置(所有字符)],
字符串:[…新集合(所有字符串)],
nums:[…新设置(所有nums)]
}
}
//试验
常量输入=[1,2,“a”,“a1”,“3”,“qw7”,“b”,“4”,“xyz”,“abcd”];
const{chars,strings,nums}=splitByType(输入);
console.log('input:',input);
log('chars:',chars);
console.log('nums:',nums)
log('strings:',strings)
这应该说明您要查找的所有案例。以下是每个案例的一些注意事项:
out1
::在第一种情况下,要将任何数字字符串转换为数字,还需要使用arraymap
方法,但如果您不介意将一些数字保留为字符串,则可以将其排除在外
out2
:对于第二种情况,为了将out2
中的所有字母分开,我们需要加入,然后重新拆分字符串。要删除任何重复项,我们使用过滤器
方法,但如果您愿意,也可以使用这个更具ES6集的方法:[…新集(arr)]
out3
::对于您的第三种情况,也就是最后一种情况,我们可以使用与我们用于out2
的过滤器非常相似的过滤器,但我们不检查每个
字符都不是数字,而是检查以确保某些
是数字。我们还删除了使用的join
和split
,因为out3
的预期结果是多字符串
以下是我的职能:
const arr=[1,2,“a”,“a1”,“3”,“qw7”,“b”,“4”,“xyz”,“abcd”]
const out1=arr.filter(Number).map(Number)
// -> [1, 2, 3, 4]
const out2=arr.filter(e=>!Number(e)和&e.split(“”)。every(f=>!Number(f)))。join(“”)。split(“”)。filter((e,i,a)=>a.indexOf(e)==i)
//->[“a”、“b”、“x”、“y”、“z”、“c”、“d”]
const out3=arr.filter(e=>!Number(e)和&e.split(“”)。一些(f=>Number(f))。filter((e,i,a)=>a.indexOf(e)==i)
//->[“a1”、“qw7”]
在我下面设置的演示中,您可以随意测试这些方法中的任何一种。根据需要调整输入数组,然后使用选择框选择方法:
const filter1=arr=>arr.filter(Number).map(Number);
常量filter2=arr=>arr.filter(e=>!Number(e)和&e.split('').every(f=>!Number(f)).join('').split('').filter((e,i,a)=>a.indexOf(e)==i);
常量filter3=arr=>arr.filter(e=>!Number(e)和&e.split(“”)。一些(f=>Number(f))。filter((e,i,a)=>a.indexOf(e)==i);
ARR过滤器={
过滤器1:arr=>filter1(arr),
filter2:arr=>filter2(arr),
filter3:arr=>filter3(arr)
};
常量输入=