1,如果数组里的某两个元素相加等于16,则去除这两个元素。如 [1,3,1,15,13,2,16,0] ==》[1,2]。
实现代码:
// 1.如果数组里的值某两个相加等于16,则删掉 var arr = [1,3,1,15,13,2,16,0]; arr.forEach(function( item1, index1 ){ arr.forEach(function( item2, index2 ){ if ( index1!=index2 && item1+item2==16 ) { arr[index1] = '#'; arr[index2] = '#'; } }) }) var newArr = arr.filter(function(item){ if ( item == '#' ) { return false; }else{ return true; } }) console.log(arr, newArr);
点评:这个题目考察数组操作是否熟练,和实现思路。
2,[‘1′,’2′,’3’].map(parseInt)的返回值是什么?看截图
点评:这个题目考得比较综合,parseInt传入两个参数,传入map的函数可以传入三个参数,具体解析看下面。
parseInt() 函数能解析一个字符串,并返回一个整数,需要两个参数 (val, radix),
其中 radix 表示要解析的数字的基数。【该值介于 2 ~ 36 之间,并且字符串中的数字不能大于radix才能正确返回数字结果值】;
但此处 map 传了 3 个 (element, index, array),我们重写parseInt函数测试一下是否符合上面的规则。
function parseInt(str, radix) { return str+'-'+radix; }; var a=["1", "2", "3"]; a.map(parseInt); // ["1-0", "2-1", "3-2"] 不能大于radix
因为二进制里面,没有数字3,导致出现超范围的radix赋值和不合法的进制解析,才会返回NaN
所以[“1”, “2”, “3”].map(parseInt) 答案也就是:[1, NaN, NaN]
实现三位数分节法
如 123213.23 转成 123,213.23
function format_number(n){
var isFloat = n.toString().indexOf('.') > -1 ? true : false;
if ( isFloat ) {
var dotPart = n.toString().substr( n.toString().indexOf('.') );
}
var b=parseInt(n).toString();
var len=b.length;
if(len<=3){
return b;
}
var r=len%3;
var intPart = r>0?b.slice(0,r)+","+b.slice(r,len).match(/d{3}/g).join(","):b.slice(r,len).match(/d{3}/g).join(",");
return isFloat ? intPart + dotPart : intPart;
}
console.log( format_number( 1231232123.231 ) );
点评:这个题目有点难,很综合,关键思路要写出来。
2021-04-07 更新
三位数分节的正则解法有点难写,似乎还得区分带小数点和不带小数点的情况。难道不能一个正则搞定吗?
var n = '123456789'
n = n.replace(/\d(?=(\d{3})+$)/g, a => a + ',')
console.log(n)
var n = '123456789.12'
n = n.replace(/\d(?=(\d{3})+\.)/g, a => a + ',')
console.log(n)
4,浮点数的比较,查看参考链接。
点评:这个比较的方式其实是一个思路考察,可以先比较整数部分,再比较小数部分;如果整数部分不能比较出结果,就使用parseInt转化小数部分。
绝世聪明男票砸
你是谁呀?