lgwebdream / FE-Interview

🔥🔥🔥 前端面试,独有前端面试题详解,前端面试刷题必备,1000+前端面试真题,Html、Css、JavaScript、Vue、React、Node、TypeScript、Webpack、算法、网络与安全、浏览器
https://lgwebdream.github.io/FE-Interview/
Other
6.82k stars 896 forks source link

Day257:在不改变原数组的前提下,添加或删除某个元素,获得一个新数组(多种方式实现) #1076

Open Genzhen opened 3 years ago

Genzhen commented 3 years ago
// 示例
let arr = [1, 2, 3, 4, 5]; // 原数组
let newArr = /*对arr操作*/

每日一题会在下午四点在交流群集中讨论,五点小程序中更新答案 欢迎大家在下方发表自己的优质见解

二维码加载失败可点击 小程序二维码

扫描下方二维码,收藏关注,及时获取答案以及详细解析,同时可解锁800+道前端面试题。

luuman commented 2 years ago

答案:

在不改变原数组的前提下,向该数组的首位添加一个新的元素,得到一个新数组,假设新增元素为0:

concat
let arr = [1, 2, 3, 4]
let newArr = [].concat(0, arr)
console.log(arr) // [1, 2, 3, 4]
console.log(newArr) // [0, 1, 2, 3, 4]

扩展运算符

let arr = [1, 2, 3, 4]
, newArr = [0, ...arr]
console.log(arr) // [1, 2, 3, 4]
console.log(newArr) // [0, 1, 2, 3, 4]
reduce
let arr = [1, 2, 3, 4]
, newArr = arr.reduce((acc, cur) => {
  acc.push(cur)
  return acc
}, [0])
console.log(arr) // [1, 2, 3, 4]
console.log(newArr) // [0, 1, 2, 3, 4]

同样的前提条件下,删除该数组的最后一个元素,得到一个新数组:

slice

let arr = [1, 2, 3, 4]
, newArr = arr.slice(0, -1)
console.log(arr) // [1, 2, 3, 4]
console.log(newArr) // [1, 2, 3]

reduce

let arr = [1, 2, 3, 4]
, last = arr.length - 1
, newArr = arr.reduce((acc, cur, idx) => {
  if (idx !== last) {
    acc.push(cur)
  }
  return acc
}, [])
console.log(arr) // [1, 2, 3, 4]
console.log(newArr) // [1, 2, 3]

解答思路:

这道题主要考察数组相关操作,包括一些数组 API 的使用。

我们需要清楚哪些 API 不会修改原数组,哪些 API 在使用的时候会对原数组造成影响,简单归纳一下:

不修改原数组

slice
concat
forEach
map
every
some
filter
reduce
reduceRight
keys
values
entries
includes
find
findIndex
flat
flatMap

修改原数组


splice
pop
push
shift
unshift
sort
reverse
fill
copyWithin