zhangxinxu/quiz

JS基础测试34期

Opened this issue · 62 comments

本期题目如下:

本期答题非开放性问题,因此:

不要查资料,答题前不要看别人回答,答题后可以,但不能修改自己回答

大家提交回答的时候,注意缩进距离,起始位置从左边缘开始;另外,github自带代码高亮,所以请使用下面示意的格式。

```js
// 你的JS代码写在这里
 ```

其它:

  1. 首位答题者可获得直播翻牌机会;
  2. 本期为下半学期第一期,因此从零开始重新计分;
  3. 本次答疑直播为7月6日上午10:00家里小朋友生病,暂时改期为7月7日上午10:00),大约30分钟;
9lk commented
  1. 4

  2. arr.filter( item => !!item) // zxx: 本题只是过滤空数组项,不包括null, undefined这类。

  3. [1, NaN, NaN, NaN] // 如果按照空数组项转换,应该是 [1, NaN, , NaN]

  4. arr.concat(arr2)

  5. 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
  1. 4

  2. arr = arr.filter(option => option)

  3. [1, NaN, undefined, NaN]

  4. const arr3 = arr.concat(arr2)

  5. Array.from(new Set(arr3))

  1. 4
  2. arr.filter(x => x != undefined)
  3. [1, NaN, NaN, NaN]
  4. arr.concat(arr2)
  5. [...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);
zy017 commented
  1. 4
  2. arr.filter(() => true)
  3. [1, NaN, NaN, NaN]
  4. arr3 = arr.concat(arr2)
  5. 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 元素(而不会牵连 0NaNnullundefined'' 这些)

arr = arr.filter(it => true);
console.log(arr);  // [1, 2, 3]

第 3 题:写出表达式运行结果

解析:parseInt 接收 stringradix 两个参数,前者是待转换的字符串,后者是进制参考基数,默认是 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))
  1. 4
arr = arr.reduce(function(original, next) {
	if (next !== undefined) {
		original.push(next);
	}
	return original;
}, []);
  1. [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
})
  1. 4
  2. arr=arr.filter(item=>{ return true })
  3. let arr2=[1, NaN, NaN]
  4. let arr3=arr.concat(arr2)
  5. Array.from(new Set(arr3))
  1. 4
  2. arr.filter(item => !!item)
  3. [1, NaN, NaN, NaN]
  4. [...arr, ...arr2]
  5. [...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);
  1. 4
  2. 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
  1. 4

arr1 = arr.filter(item => item)
arr2 = [1, 2, NaN, 3]
arr3 = [].push.apply(arr, arr2)
arr3 = Array.from(new Set(arr3))
tzmy commented

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未去重
  1. 4
  2. 去除空项
arr=arr.filter(item=>item!==null)
  1. [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
}
  1. 去除重复数据
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]
  1. 4
arr = arr.filter(item => !!item)
  1. [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]

image

代码修改

(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]
  1. 第一题
4
  1. 第二题
arr = arr.filter(item => item !== undefined)
  1. 第三题
[1, NaN, NaN]
  1. 第四题
var arr3 = arr.concat(arr2)
  1. 第五题
arr3 = [...new Set(arr3)]

本期要点:

  1. 空数组项也会作为length的一部分;空数组项和空字符串项是有区别的。
  2. 第2题 本题只是过滤空数组项,不包括null, undefined这类。
  3. 去除空数组项两个比较好的回答:
    1. 数组中的 empty 元素不会参与数组项遍历,故只需返回 true 即可过滤掉 empty 元素(而不会牵连 0、NaN、null、undefined、'' 这些)arr.filter(it => true)。然后补充,但是走for循环,还是会遍历empty数组项。
    2. 或者filter方法参数直接就是一个function即可。例如:arr.filter(Boolean)(纠正:不能是Boolean,false会被过滤),arr.filter(Number), arr.filter(String)
    3. 上面并不会最好的方法。数组有个API,天然去除空数组项,arr.flat()。flat()可以让数组扁平化的方法。
  4. 第3题标准答案应该是[1, NaN, NaN],map里面Function支持参数(value, index, arr),参见wingmeng的释义。
  5. 第4题就是concat,可以数组合并。我自己用“连接猫”记忆这个API。可以分别连接子项,也可以直接连接数组。如果不考虑兼容,可以[...arr, ...arr2]。其他参考方法:Array.prototype.push.apply(arr3, arr2),也可以[].push.apply(arr3, arr2),此时arr3是合并后的数组。
  6. 数组去重。使用new Set(arr3),然后把Set对象转换成数组。转数组两个常用方法,一个是Array.from,还有一个是[...]。
  7. 本次小测积分满分是8积分。 (抱歉,睡眠不足脑子短路了,满分是10积分,参与者都有2积分底分的)
  1. 或者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
}, [])