let arr = [
[
[
'1-7',
'2-6',
'4-5',
],
'4-6',
[
['2-0', '1-4'],
['3-9'],
'4-5',
],
]
];
// Q1: 完成数组 flat 函数
// 1) 不指定dep 默认Infinity
function flat(arr) {
let newArr = [];
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
newArr = newArr.concat(flat(arr[i]));
} else {
newArr = newArr.concat(arr[i]);
}
}
arr = newArr;
return arr;
}
// 2) 指定dep 参考 (https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/flat)
function _flat(flatArray, dep=1){
if(Number.isNaN(Number(dep))||Number(dep)<1) return flatArray;
var curDep = 1;
function recursionFun(flatArray, dep, curDep){
return flatArray.reduce((acc,val) => (
Array.isArray(val)&&(dep === Infinity || curDep< dep)
? acc.concat(recursionFun(val, dep, curDep + 1))
: acc.concat(val)
), []);
}
return recursionFun(flatArray, dep, curDep);
}
arr = _flat(arr, Infinity);
console.log(arr);
// Q2: 计算 arr 中所有的值:'1-7' => 1 * 7 = 7, 返回一个数字组成的数组
function calc(arr) {
for (let i = 0; i < arr.length; i++) {
if (arr[i].indexOf('-') > -1) {
arr[i] = eval(arr[i].replace('-', '*'));
}
}
return arr;
}
arr = calc(arr);
console.log(arr);
// Q3: 对这个数组排序和去重
function sortAndReduce(arr) {
// code
// 去重
arr = Array.from(new Set(arr));
// 排序
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] < arr[j]) {
[arr[i], arr[j]] = [arr[j], arr[i]]
}
}
}
return arr;
}
arr = sortAndReduce(arr);
console.log(arr);
function foo(x) {
x.push( 4 );
x; // [1,2,3,4]
x = [4,5,6];
x.push( 7 );
x; // [4,5,6,7]
}
var a = [1,2,3];
foo( a );
a; // [1,2,3,4]
我们向函数传递 a 的时候,实际是将引用 a 的一个复本赋值给 x ,而 a 仍然指向 [1,2,3] 。在函数中我们可以通过引用 x来更改数组的值(push(4) 之后变为 [1,2,3,4] )。但 x = [4,5,6] 并不影响 a 的指向,所以 a 仍然指向[1,2,3,4] 。
接下来再看一个栗子:
function foo(x) {
x.push( 4 );
x; // [1,2,3,4]
x.length = 0; // 清空数组
x.push( 4, 5, 6, 7 );
x; // [4,5,6,7]
}
var a = [1,2,3];
foo( a );
a; // [4,5,6,7],
从上例可以看出,x.length = 0 和 x.push(4,5,6,7) 并没有创建一个新的数组,而是更改了当前的数组。于是 a 指向的值变成了 [4,5,6,7] 。