JS基础测试34期
Opened this issue · 62 comments
-
4
-
arr.filter( item => !!item) // zxx: 本题只是过滤空数组项,不包括null, undefined这类。
-
[1, NaN, NaN, NaN] // 如果按照空数组项转换,应该是 [1, NaN, , NaN]
-
arr.concat(arr2)
-
Array.from(new Set(arr3))
1、arr.length
2、arr = arr.flat()
3、[1, NaN, NaN, NaN]
4、arr3 = arr.concat(arr2)
5、Array.from(new Set(arr3))
// 第一题
let arr = [1,2,,3]
// arr 的长度是4
// 第二题
let arr2 = [];
[1,2,,3].forEach(v=>{v!=undefined && arr2.push(v)})
// 囧 尽然忘记 filter 了 let arr2 = arr.filter(v => v != undefined);
// 第三题
[1, NaN, NaN, NaN]
// arr2.map(parseInt) ->parseInf(1,0)-> parseInf(2,1) -> parseInf(undefined,2) -> parseInf(3,3)
// 第四题
let arr3 = arr2.conact(arr)
// 第五题
Array.from(new Set([1,2,3,3])) // 通过Set去重,得到类数组,Array.from 转化得到数组
var arr = [1,2,,3];
arr.length = 4; // 题1
arr.filter(item => !item.prototype); // 题2
var arr2 = arr.map(parseInt);
/*题3
map前两个参数为 value, index;
parseInt两个参数:数字,进制;
相当于执行parseInt(1,0);parseInt(2,1);parseInt(empty, 2); parseInt(3, 3);
结果: [1, NaN, empty, NaN]
*/
var arr3 = arr.concat(arr2); // 题4
arr3 = [...new Set(arr3)]; // 题5
-
4
-
arr = arr.filter(option => option)
-
[1, NaN, undefined, NaN]
-
const arr3 = arr.concat(arr2)
-
Array.from(new Set(arr3))
- 4
- arr.filter(x => x != undefined)
- [1, NaN, NaN, NaN]
- arr.concat(arr2)
- [...new Set(arr3)]
let arr = [1,2,,3];
//1.arr的长度是4
console.log(arr.length);
//2.
for(let i=arr.length-1;i>=0;i--){
if(!arr[i]){
arr.splice(i,1);
}
}
console.log(arr);
//3.arr2=[1,NaN,NaN]
const arr2 = arr.map(parseInt);
console.log(arr2.toString());
//4.
let arr3 = arr.concat(arr2); //zxx: let IE不支持,不得分
console.log(arr3);
//5.
arr3 = [...new Set(arr3)];
console.log(arr3);
- 4
- arr.filter(() => true)
- [1, NaN, NaN, NaN]
- arr3 = arr.concat(arr2)
- Array.from(new Set(arr3))
1. 4
2. arr.splice(2,1)
3. [1,2,0,3]
4. let arr3 = arr.concat(arr2) //zxx: let IE不支持
5. let arr3 = [...new Set(arr3)]
//1.
4
//2
arr.filter(v=>v!==undefined)
//3
arr2=[1,NaN,undefined,NaN]
//4
arr3=Array.prototype.concat.apply(arr,arr2)
//5
Array.from(new Set(arr3))
第 1 题:arr 的长度是多少?
解析:数组中的空元素 (empty 元素) 也会被算到数组长度中
console.log(arr.length); // 4
第 2 题:去除 arr 中的空数组项
解析:数组中的 empty 元素不会参与数组项遍历,故只需返回 true 即可过滤掉 empty 元素(而不会牵连 0
、NaN
、null
、undefined
、''
这些)
arr = arr.filter(it => true);
console.log(arr); // [1, 2, 3]
第 3 题:写出表达式运行结果
解析:parseInt 接收 string
和 radix
两个参数,前者是待转换的字符串,后者是进制参考基数,默认是 10。当 parseInt 作为 map 方法的回调函数时,parseInt 的 string
的实参是数组项,radix
的实参是数组索引值,故执行过程如下:
parseInt(1, 0); // 1. `radix` 为 0 时会自动转换成 10,故输出 1
parseInt(2, 1); // 2. `radix` 值非法(没有一进制),无法解析,故输出 NaN
parseInt(3, 2); // 3. `string` 为 3 ,`radix` 为 2,无法将 3 按二进制解析,故输出 NaN
let arr2 = arr.map(parseInt);
console.log(arr2); // [1, NaN, NaN]
第 4 题:arr 和 arr2 合并成数组 arr3,兼容 IE8+
var arr3 = arr.concat(arr2);
console.log(arr3); // [1, 2, 3, 1, NaN, NaN]
第 5 题:去除 arr3 中重复内容
解析:利用 ES6 中的 Set 集合不存在重复项的特点来去重
arr3 = [...new Set(arr3)];
console.log(arr3); // [1, 2, 3, NaN]
let arr = [1,2,,3]
// 第一题
4
//第二题
arr = arr.filter(item=>{
if(item){
return item
}
})
// 第三题
//如果紧接第二题答案是
arr2 = [1, NaN, empty, NaN]
//如果初始数组不被过滤答案是
arr2 = [1, NaN, NaN]
//第四题
arr3 = (arr2.join()+','+arr.join()).split(',')
//第五题
let arrset = new Set(arr3)
arr3 = [...arrset]
//第一题
4
//第二题
arr = arr.flat();
//第三题
[1, NaN, NaN]
//第四题
var arr3 = arr.concat(arr2);
//第五题
arr3 = [...new Set(arr3)];
let arr = [1, 2, , 3];
// 1. arr 的长度是多少?
console.log(arr.length) // 4
// 2. 去除 arr 中的空数组项
let arrFilter = arr.filter(item => item);
console.log(arrFilter) // [1, 2, 3]
// 3. arr2 = arr.map(parseInt), 请填写一下内容
let arr2 = arr.map(parseInt);
console.log(arr2) // [1, NaN, NaN];
// 4. arr 和 arr2 合并成数组arr3, 兼容IE8+
let arr3 = [].concat(arr,arr2);
console.log(arr3) // [1, 2, 3, 1, NaN, NaN]
// 5. 去除数组arr3的重复内容
arr3 = [...new Set(arr3)];
console.log(arr3) // [1, 2, 3, NaN]
1, 4
2, arr.filter(Boolean) //zxx: 赞,学习了,Number, String均可,更新,经反馈,Boolean会过滤false项
3, [1, NaN, NaN]
4, arr.concat(arr2)
5, Array.from(new Set(arr3))
- 4
arr = arr.reduce(function(original, next) {
if (next !== undefined) {
original.push(next);
}
return original;
}, []);
- [1, NaN, NaN]
arr3 = arr.concat(arr2);
var listHasNaN = function(list) {
return list.filter(function(v) {
return isNaN(v)
}).length > 0;
};
arr3 = arr3.reduce(function(original, current) {
if ((isNaN(current) && !listHasNaN(original)) || (!isNaN(current) && original.indexOf(current) < 0)) {
original.push(current);
}
return original;
}, []);
let arr = [1, 2, , 3]
// 1. 4
// 2
arr = arr.filter(v => v !== undefined)
// 3 [1, NaN, NaN]
// 4
let arr2 = [1, NaN, NaN]
let length = arr2.length;
let arr3 = arr // zxx: arr3最好复制arr
for (var i = 0; i < length; i++) {
arr3.push(arr2[i])
}
console.log(arr3)
// 5
// 不兼容ie8+
arr3 = [...new Set(arr3)] // 无法处理NaN
console.log(arr3)
// 兼容
let arr3Length = arr3.length
let arr4 = [arr3[0]]
for (let i = 1; i < arr3Length; i++) {
for (let j = 0; j < arr4.length; j++) {
if (arr3[i] === arr4[j] || (isNaN(arr3[i] && isNaN(arr4)))) {
break
}
}
arr4.push(arr3[i])
}
console.log(arr4)
//第一题
4
//第二题
let arr = [1,2, ,3]
// arr = arr.filter(item => {
// return item;
// })
arr = arr.filter(item => item)
//第三题
arr2 = [1, NaN, NaN]
//第四题
arr3 = arr.concat(arr2);
//第五题
//zxx: NaN不友好
arr3 = arr3.filter((item,index,arr) => {
return arr3.indexOf(item) === index
})
4
arr=arr.filter(item=>{ return true })
let arr2=[1, NaN, NaN]
let arr3=arr.concat(arr2)
Array.from(new Set(arr3))
- 4
- arr.filter(item => !!item)
- [1, NaN, NaN, NaN]
- [...arr, ...arr2]
- [...new Set(arr3)]
var arr=[1,2,,3];
console.log(arr.length);//1、4
for(var i=0;i<arr.length;i++){
if(arr[i]==''||arr[i]==null||arr[i]==undefined){
arr.splice(i,1);//删除当前i位置的为空的1个数
i=i-1;
}
}
console.log(arr);//2、[1, 2, 3]
var arr2=arr.map(parseInt);
console.log(arr2);//3、[1, NaN, NaN]
var arr3=[];
if(arr2.length>arr.length){ //zxx: 为何需要判断长度?
arr3=arr2.concat(arr)
}else{
arr3=arr.concat(arr2)
}
console.log(arr3);//4、[1, 2, 3, 1, NaN, NaN]
var set = new Set(arr3);//去重
var temp = Array.from(set); //转为数组
console.log(temp);// 5、[1, 2, 3, NaN]
let arr = [1,2,,3];
//第一题 4
console.log(arr.length);
//第二题
//es5写法
arr = arr.filter(function(i){
return i;
});
//es5写法
arr = arr.filter(i => i);
console.log(arr);
//第三题 [1, NaN, NaN]
arr2 = arr.map(parseInt);
console.log(arr2);
//第四题 [1, 2, 3, 1, NaN, NaN]
arr3 = arr.concat(arr2);
console.log(arr3);
//第五题 [1, 2, 3, NaN]
arr3 = arr3.reduce((acc,cur)=>{
if(!acc.includes(cur)){
return acc.concat(cur)
}else{
return acc
}
},[])
console.log(arr3);
- 4
- String([1,2,,3]).replace(/(,+)/g,',')
3.[1,NaN,NaN,NaN]
4.let arr3 = arr; Array.prototype.push.apply(arr3, arr2)
5.[...new Set(arr3)]
let arr = [1,2,,3];
//(1) 4
//(2)
arr.filter((ele) => { return typeof ele !== 'undefined'});
//(3) arr2 = [parseInt(1, 0), parseInt(2, 1), parseInt(undefined, 2), parseInt(3, 3)]
//(4)
arr3 = [1,2,,3].concat([], [parseInt(1, 0), parseInt(2, 1), parseInt('', 2), parseInt(3, 3)]);
//(5)
function singleCope(arr) {
let arrCopy = [];
arr.forEach((ele) => {
if (!arrCopy.includes(ele)) {
arrCopy.push(ele);
}
});
return arrCopy;
}
singleCope(arr3);
let arr = [1,2,,3]
// 1
// arr.length = 4
// 2
arr = arr.filter(item => item !== undefined)
// arr = [1,2,3]
// 3
第 2 题改变了 arr 的值
arr2 = [1, NaN, NaN]
// 4
arr3 = arr.concat(arr2)
// arr3 = [1, 2, 3, 1, NaN, NaN]
// 5
arr3 = arr3.filter((item, idx, array) => array.indexOf(item) === idx)
// arr3 =p[1, 2, 3]
// zxx: NaN不友好
//1.
4
//2
arr = arr.filter(item => item !== undefined)
//3
[1,NaN,NaN]
//4
arr3 = arr.concat(arr2)
//5
arr3 = [...new Set(arr3)]
// 第一题
arr.length = 3
// 第二题
arr = arr.filter(el => !!el)
// 第三题
[1, NaN, NaN]
// 第4题
arr3 = arr.concat(arr2)
// 第5题
var temp = []
arr3.forEach(el => {
if (temp.indexOf(el) === -1) {
emp.push(el)
}
})
arr3 = temp // [1, 2, 3, NaN, NaN]
let arr = [1,2,,3];
/** Q1
* answer: 4
*/
/* Q2 */
arr = arr.filter(item => !!item);
/* Q3 based on Q2 */
let arr2 = arr.map(parseInt);
// arr2 will be [1, NaN, NaN]
/* Q4 */
let arr3 = arr.concat(arr2);
// arr3 will be [1, 2, 3, 1, NaN, NaN]
/* Q5 */
arr3 = new Set(arr3);
// arr3 will be [1, 2, 3, NaN]
1. console.log(arr.length); // 4
2. arr = arr.filter((value) => !!value);
3. arr2 = arr.map(parseInt);
console.log(arr2); // 1 2 3,好像只有我下意识的认为应该输出123
4. arr3 = arr.concat(arr2);
5. arr3.forEach((value,index) => {
if(arr3.indexOf(value)<index){
arr3.splice(index, 1);
}
});
// zxx: 此方法有bug,[1,2,2,2]去重后结果是[1,2,2]
1. arr.length = 4
2. arr = arr.filter(x => x ? : '')
3. [1, NaN, 0, NaN]
4. let arr3 = arr1.concat(arr2) //zxx: let IE可不支持哦
5. arr3 = [...new Set(arr3)]
// 1.
console.log(arr.length); // 4
// 2.
arr = arr.filter( item => { if(item !== undefined)return true; } );
console.log(arr);
// 3.
// 输出1 NaN NaN
// 4.
// arr3 = arr.concat(arr2);
let arr3 = [];
arr3.push(...arr);
arr3.push(...arr2);
console.log(arr3);
// 5.
let arr4 = [];
let obj = {};
for(let key of arr3) {
if(obj[key] === undefined) {
obj[key] = key;
arr4.push(key);
} else continue;
}
arr3 = arr4;
console.log(arr3);
// zxx: 有bug,数组中的undefined项无法去重
; (function () {
var arr = [1, 2, , 3]
// 1. arr的长度是多少? 4
console.log(arr.length)
// 2. 去除arr中的空数组项;
Array.prototype.collapseEmpty = function () {
return this.filter(function (item) {
return !(item === null || item === undefined || item === '' || item !== item)
})
}
arr.collapseEmpty()
// 3. 留空了, 对parseInt,的第二个参数以及返回值只有朦胧的认知,不扎实只能猜测.
var arr2 = arr.map(parseInt)
// 4. arr 和 arr2 合并
var arr3 = arr.concat(arr2) ; //concat 不是新函数, 应该没问题, 不行就循坏push...
// 5. 去重
Array.prototype.notSame = function () {
var arr = this.slice()
for (var i = 0; i < arr.length; i++) {
for (var j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
arr.splice(j, 1)
}
}
}
return arr
}
console.log([33, 33, 55, '55', 99, 9, 4, 33].notSame())
})()
1. 4
2. arr.filter(item => true)
3. [1, NaN, NaN]
4. arr3 = arr.concat(arr2)
5. arr3 = [...new Set(arr3)]
后续补充:针对第二小题去除空值,发现es5的高阶函数都可以实现(遍历数组时,遇到空值项不会进行遍历),而for循环还是会进入循环体
// 1. reduce(个人觉得用reduce语意更好些)
arr.reduce((arr1, item) => [...arr1, item], [])
// 2. map
let arr1 = [];
arr.map(item => {
arr1.push(item)
})
// 3. forEach
let arr1 = [];
arr.forEach(item => {
arr1.push(item)
})
...还有其他高阶函数也可以实现,不过语意不好
let arr = [1,2,,3];
// 1、arr.length === 4;
// 2、认为 undefined null '' 都是空
for (let i = 0;i < arr.length; i += 1) {
if (!Boolean(arr[i])) {
arr.splice(i, 1);
i -= 1;
}
}
console.log(arr);
// 3、好吧,这个我不会
let arr2 = arr.map(parseInt);
// 4、
function concat(arr1, arr2){
var arr = [];
for (var i = 0; i < arr1.length; i += 1) {
arr[i] = arr1[i];
}
for (var j = 0;j < arr2.length; j += 1) {
arr[arr.length] = arr2[j];
}
return arr;
}
let arr3 = concat(arr, arr2);
console.log(arr3);
// 5、去重
function uniqueArr(arr){
var newArr = [];
for(var i = 0; i < arr.length; i += 1){
var flag = true;
for (var j = 0; j < newArr.length; j += 1) {
if ((newArr[j] + '') === ((arr[i]) + '')) {
flag = false;
break;
}
}
if (flag) {
newArr[newArr.length] = arr[i];
}
}
return newArr;
}
console.log(uniqueArr(arr3));
不会果断查资料啦,原来parseInt里面这么多东西的
关于parseInt原理介绍 http://ecma-international.org/ecma-262/5.1/#sec-15.1.2.2
parseInt(string , radix)
if (radix !== 0) {
if (radix < 2 || radix > 36) {
return NaN;
}
if (radix !== 16) {
// 16进制这里做了其他处理,英文不好看不懂
}
} else {
radix = 10;
}
// map 回调函数为parseInt
// 第一次循环 parseInt(1, 0); => parseInt(1, 10) => 1
// 第二次循环 parseInt(2, 1); radix < 2 => NaN
// 第三次循环 parseInt(3, 2); 转二进制只识别 0 1,所以3非法了 => NaN
-
4
arr1 = arr.filter(item => item)
arr2 = [1, 2, NaN, 3]
arr3 = [].push.apply(arr, arr2)
arr3 = Array.from(new Set(arr3))
demo
1.4
2.
// zxx: undefined, NaN不应过滤
function clearEmpty(arr){
var newArr = [];
for(var i = 0;i<arr.length;i++){
if(arr[i]&&arr[i]!=''){
newArr.push(arr[i]);
}else{
}
}
return newArr;
}
var newArr = clearEmpty(arr);
3.我答的是:1,2,NaN,3
4.var arr3 = arr.concat(arr2);
5.
function clearRepetition(arr){
var newArr = [];
var numberNaN = 0;
for(var i = 0;i<arr.length;i++){
if(Number.isNaN(arr[i])){
numberNaN++;
if(numberNaN<2){
newArr.push(arr[i]);
}
continue;
}
var flag = true;
for(var j = 0;j<newArr.length;j++){
if(arr[i]==newArr[j]){
flag =false;
break;
}
}
if(flag){
newArr.push(arr[i]);
}
}
return newArr;
}
var a = clearRepetition(arr3);
1.
let arr= [1,2,,3]
console.log(arr.length)
2.
let arr1 = arr.filter(Boolean)
console.log(arr1)
3.
let arr2 = arr.map(parseInt)
console.log(arr2) //[1, NaN, undefined, NaN]
4.
let arr3= arr.concat(arr2)
console.log(arr3)
5.
function flat(arr){
let obj = {}
arr.forEach((item)=>{
obj[item] = 1
})
return Object.keys(obj).map(Number)
}
console.log(flat(arr3))
// zxx: NaN未去重
- 4
- 去除空项
arr=arr.filter(item=>item!==null)
- [1,NaN,NaN]
/**
* 传入多个数组,返回合并副本
**/
function concat() {
var a = [];
for (var i = 0; i < arguments.length; i++) {
for (var j = 0; i < arguments[i].length; j++) {
a.push(arguments[i])
}
}
return a
}
- 去除重复数据
arr3=[...new Set(arr3)];
var arr = [1,2,,3]
//1.获取arr的长度
console.log(arr.length); // 4
//2.去除arr数组中的空数组项
for (var i = 0; i < arr.length; i++) {
if (arr[i] == null) {
arr // 到这里就不会了
}
}
// 3 4 5 更不会了
arr.length = 4
arr = arr.filter((item) => {
return Number.isNumber(item)
})
[1, NaN, 11]
arr3 = arr.concat(arr2)
[...newSet(arr3)] // zxx: 空格丢了
1,arr.length
2,arr.filter(item => item != undefined)
3,[1, NaN, empty, NaN]
4,arr.concat(arr2)
5,Array.from(new.Set(arr3))
let arr = [1,2,,3];
//第一题
console.log("arr length",arr.length);
console.log("---------------------");
A:4
//第二题 遍历过滤掉undefined的成员
arr = arr.filter(value => value != undefined)
console.log("arr length",arr.length);
console.log("---------------------");
A:3
//第三题
var arr2 = arr.map(parseInt);
arr2.forEach(value => console.log("arr2 ",value));
console.log("---------------------");
A:[1,NaN,NaN]
//第四题 api合并方法
var aar3 = arr.concat(arr2);
aar3.forEach(value => console.log("arr3 ", value));
console.log("---------------------");
A:[1,2,3,1,NaN,NaN]
//第五题 Set不重复集合特性再初始化成array 这个效率算是最高的吧
aar3 = Array.from(new Set(aar3))
aar3.forEach(value => console.log("arr3 ", value));
A:[1,2,3,NaN]
4
arr = arr.filter(item => !!item)
[1, NaN, 11]
let arr3 = [].concat(arr, arr2)
arr3 = Array.from(new Set(arr3))
let arr = [1, 2,, 3];
// 1.arr的长度为4
console.log('1.arr的长度为:', arr.length)
// 2.
arr = arr.filter(item => item !== '')
console.log('2.去除空数组项后的结果为:', arr)
// zxx: 空项和空字符串还是有区别的
// 3.arr2的值为 [1, NaN, NaN]
console.log('3.arr2的值为:', arr.map(parseInt))
// 4.
let arr2 = arr.map(parseInt)
let arr3 = arr.concat(arr2)
console.log('4.合并后arr3为:', arr3)
// 5.
arr3 = arr3.reduce((prev, next) => prev.includes(next) ? prev : prev.concat(next), [])
console.log('5.出重之后的arr3的值为:', arr3)
// 1
4
// 2
arr.filter(String) // 如果是清除假值则使用 arr.filter(e => e)
// 3
arr2 = [1, NaN, empty, NaN]
// 4
var arr3 = arr.concat(arr2)
// 5
[...new Set(arr3)]
// 或者
function uniq(arr) {
var seen = {}
var out = []
var len = arr.length
var j = 0
for (var i = 0; i < len; i++) {
var item = arr[i]
if (seen[item] !== 1) {
seen[item] = 1
out[j++] = item
}
}
return out
}
uniq(arr3)
let arr = [1,2,,3]
// 1. arr 的长度
console.log(arr.length) // 4
// 2. 过滤假值
arr = arr.filter((item => item)) // [1, 2, 3]
console.log(arr);
// 3. parseInt
let arr2 = arr.map(parseInt)
console.log(arr2) // [1, NaN, NaN]
// 4. 合并数组
let arr3 = arr.concat(arr2)
console.log(arr3) // [1, 2, 3, 1, NaN, NaN]
// 5. 去重
let arr4 = [...new Set(arr3)]
console.log(arr4); // [1, 2, 3, NaN]
1.arr的长度为4;
2.
var array=[];
arr.forEach((value) =>{
array.push(value);
arr=array;
})
3.[1,NaN,,NaN]
4.arr3=arrr.concat(arr2)
5.
var temp = []; //一个新的临时数组
for(var i = 0; i < arr3.length; i++){
if(temp.indexOf(arr3[i]) == -1){
temp.push(arr3[i]);
}
}
arr3=temp;
//zxx: NaN无法去重
1.length 为4
2.
arr.filter(i => i)
3.[1,NaN,NaN]
4.arr3 = arr.concat(arr2);
5.Array.from(new Set(arr3))
// 1
arr.length === 4
// 2
let filteredArr = arr.filter((n) => n !== undefined)
// 3
let arr2 = [1, NaN, NaN, NaN]
// 4
let arr3 = arr.concat(arr2)
// 5
let set3 = new Set(arr3)
arr3 = Array.from(set3)
1. 4
2. arr.filter(item => item)
3. [1, NaN,,NaN]
4. var arr3 = arr.concat(arr2)
5. [...new Set(arr3)]
(function () {
// 第一题
let arr = [1, 2, , 3];
console.log('第一题 arr 的长度是: 4');
// 第二题
let arrWithOutEmpty = [];
arr.map(function (item, index) {
arrWithOutEmpty.push(item);
});
arr = arrWithOutEmpty;
console.log('第二题 arr 去空之后是: ', arr);
// 第三题
let arr2 = arr.map(parseInt);
console.log('第三题 arr2 的内容: [1,2,3]', '正确答案: ', arr2)
// 第四题
let arr3 = [].concat(arr, arr2); // zxx: let IE8不支持
console.log('第四题 arr3: ', arr3);
// 第五题
let newArr = [];
let newArrHadNaN = false;
for (let i = 0, len = arr3.length; i < len; i++) {
const item = arr3[i];
const itemIsNaN = isNaN(item);
if (itemIsNaN && newArrHadNaN) {
break;
}
if (newArr.indexOf(item) === -1) {
newArr.push(item);
if (itemIsNaN) {
newArrHadNaN = true;
}
}
}
arr3 = newArr;
console.log('第五题 arr3:', arr3);
})();
// zxx: 使用arr3 = [7, undefined, NaN, NaN, undefined, 2, 3, 3, 3, 6]测试,返回是[7, undefined]
代码修改
(function () {
// 第五题
let newArr = [];
let newArrHadNaN = false;
for (let i = 0, len = arr3.length; i < len; i++) {
const item = arr3[i];
const itemIsNaN = isNaN(item);
if (itemIsNaN && newArrHadNaN) {
break;
}
if (newArr.indexOf(item) === -1) {
newArr.push(item);
if (itemIsNaN) {
newArrHadNaN = true;
}
}
}
arr3 = newArr;
console.log('第五题 arr3:', arr3);
})();
//第一题
4
//第二题
arr = arr.filter(Boolean)
//第三题
arr2 = [1,NaN,NaN]
//第四题
arr3 = arr.concat(arr2)
//第五题
arr3 = Array.from(new Set(arr3))
//1
4
//2
arr = arr.filter(n => typeof n !== 'undefined')
//3
[1, 2, 3]
//4
var arr3 = arr.concat(arr2)
//5
[...new Set(arr3)]
//1. 4
//2.
let arr = [1,2,,3];
arr = arr.filter(item=>{
return typeof item != "undefined";
});
//3
let arr2 = [undefined,undefined,2];
//4
let arr3 = arr.concat(arr2);
//5
var isShowFlag = {};
var tempArr = [];
for(let i=0;i<arr3.length;i++){
var temp = arr3[i];
if(!isShowFlag[temp]){
tempArr.push(temp);
isShowFlag[temp] = true;
}
}
arr3 = tempArr;
//zxx: 测试案例通过
//5 var isShowFlag = {}; var tempArr = []; for(let i=0;i<arr3.length;i++){ var temp = arr3[i]; if(!isShowFlag[temp]){ tempArr.push(temp); isShowFlag[temp] = true; } } arr3 = tempArr;
用哈希表去重的效率很高,然而对形如 [1, '1', 2, '2']
的数组进行去重时会出问题,因为 hash[1] === hash['1']
,曾经踩过这个坑。
//5 var isShowFlag = {}; var tempArr = []; for(let i=0;i<arr3.length;i++){ var temp = arr3[i]; if(!isShowFlag[temp]){ tempArr.push(temp); isShowFlag[temp] = true; } } arr3 = tempArr;用哈希表去重的效率很高,然而对形如
[1, '1', 2, '2']
的数组进行去重时会出问题,因为hash[1] === hash['1']
,曾经踩过这个坑。
确实存在这个问题,优化了下代码,isShowFlag的key添加了值类型前缀(如: string_1,number_1),如下:
var isShowFlag = {};
var tempArr = [];
for(let i=0;i<arr3.length;i++){
var temp = arr3[i];
var flagKey = (typeof temp) + "_" + temp;
if(!isShowFlag[flagKey]){
tempArr.push(temp);
isShowFlag[flagKey] = true;
}
}
let arr = [1, 2, , 3];
// 1.
let len = arr.length;
console.log(len); // 4;
// 2.
arr = arr.filter(v => v !== undefined);
console.log(arr); // [1, 2, 3]
// 3.
let arr2 = arr.map(parseInt);
console.log(arr2); // [1, NaN, NaN]
// 4.
let arr3 = arr.concat(arr2);
console.log(arr3); // [1, 2, 3, 1, NaN, NaN]
// 5.
let arr3Len = arr3.length;
let arr4 = [];
arr3.forEach(v => {
if(arr4.indexOf(v) === -1) {
arr4.push(v);
}
})
console.log(arr4); // [1, 2, 3, NaN, NaN]
// 使用 [...new Set(arr3)] 返回的是 [1, 2, 3, NaN]
- 第一题
4
- 第二题
arr = arr.filter(item => item !== undefined)
- 第三题
[1, NaN, NaN]
- 第四题
var arr3 = arr.concat(arr2)
- 第五题
arr3 = [...new Set(arr3)]
本期要点:
- 空数组项也会作为length的一部分;空数组项和空字符串项是有区别的。
- 第2题 本题只是过滤空数组项,不包括null, undefined这类。
- 去除空数组项两个比较好的回答:
- 数组中的 empty 元素不会参与数组项遍历,故只需返回 true 即可过滤掉 empty 元素(而不会牵连 0、NaN、null、undefined、'' 这些)arr.filter(it => true)。然后补充,但是走for循环,还是会遍历empty数组项。
- 或者filter方法参数直接就是一个function即可。例如:
arr.filter(Boolean)(纠正:不能是Boolean,false会被过滤),arr.filter(Number), arr.filter(String) - 上面并不会最好的方法。数组有个API,天然去除空数组项,arr.flat()。flat()可以让数组扁平化的方法。
- 第3题标准答案应该是[1, NaN, NaN],map里面Function支持参数(value, index, arr),参见wingmeng的释义。
- 第4题就是concat,可以数组合并。我自己用“连接猫”记忆这个API。可以分别连接子项,也可以直接连接数组。如果不考虑兼容,可以[...arr, ...arr2]。其他参考方法:Array.prototype.push.apply(arr3, arr2),也可以[].push.apply(arr3, arr2),此时arr3是合并后的数组。
- 数组去重。使用new Set(arr3),然后把Set对象转换成数组。转数组两个常用方法,一个是Array.from,还有一个是[...]。
本次小测积分满分是8积分。(抱歉,睡眠不足脑子短路了,满分是10积分,参与者都有2积分底分的)
- 或者filter方法参数直接就是一个function即可。例如:
arr.filter(Boolean)(纠正:不能是Boolean,false会被过滤),arr.filter(Number), arr.filter(String)
同样不能使用 Number, 因为 null, undefined 会变成 NaN, NaN 和 数值 0 会被过滤
1.console.log(arr.length)
2.arr.filter(e=>true)
3.1,NaN,empty,NaN
4.let abc=[1,2,3,4],
edf=[4,5,6];
Array.prototype.push.apply(abc,edf);第一种方法
[].push.apply(abc,edf);//第二种方法
5. let obj={},
newArr=[];
abc.forEach(e=>{
if(!obj[e]){
obj[e]=e;
newArr.push(e)
}
})
let arr = [1, 2, , 3]
// 1. arr的长度为4
console.log(arr.length)
// 2. 去除arr的空数组项
arr = arr.filter(num => !!num || num === 0)
// 3. [1, NaN, NaN]
const arr2 = arr.map(parseInt)
// 4. 合并
const arr3 = arr.concat(arr2)
// 5. 去除arr3的重复内容
const arr4 = arr3.reduce((arr, value) => {
if (!arr.includes(value)) {
arr.push(value)
}
return arr
}, [])