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
    ::在第一种情况下,要将任何数字字符串转换为数字,还需要使用array
    map
    方法,但如果您不介意将一些数字保留为字符串,则可以将其排除在外
  • 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)
    };
    常量输入=