js中的数组删除、对象属性删除

15,847 阅读1分钟

删除数组中的元素

  • 使用splice(会改变原数组)
    arr.splice(index,len,item);
    //index,删除或者替换的起始位置
    //len,删除或者替换的长度
    //item,替换的内容
    arr = ["a","b","c","d"]
    //删除
    arr.splice(1,2) ====>["a","d"]
    //替换
    arr.splice(1,1,"tt") ====> ["a","tt","c","d"]
    arr.splice(1,2,"tt") ====> ["a","tt","d"]
    //添加
    arr.splice(1,0,"ttt") ====> ["a","tt","b","c","d"]
  • 使用remove删除指令的元素
arr.remove(xx)
  • 使用delete
//数组长度不变,置为undefined
    delete arr[1] ====> ["a",,"c","d"]

删除对象的属性

  • 使用delete
delete obj.properti
let map = new Map(["name","xxx"])
map.delete("name")

存在的问题

1.没有直接释放内存,使得hiddenClas变成slowClass。
2.hidden class:由于 JavaScript是一种动态编程语言,属性可进行动态的添加和删除,这意味着一个对象的属性是可变的,大多数的 JavaScript 引擎(V8)为了跟踪对象和变量的类型引入了隐藏类的概念。在运行时 V8 会创建隐藏类,这些类附加到每个对象上,以跟踪其形状/布局。这样可以优化属性访问时间。
  • 将对象属性置成undefined
obj.property = undefined;
  • 使用流式操作符(spread operator for objects)
const obj = {
    name: xxx
}
const omit = (prop,{[prop]: _,...rest}) => rest //删除属性的函数
const newObj = omit("name",obj)
1.移除属性
const obj = {
    name: xxx,
    sex: xxx
}
const result = _.omit(obj,["name"])
2.保留属性
const result = _.pick(obj,["sex"])
  • 仿照lodash实现一个删除的流失操作函数
// 中规中矩式
const omit = (obj, uselessKeys) =>
   Object.keys(obj).reduce((acc, key) =>
      return uselessKeys.includes(key) ?
        acc : 
        {...acc, [key]: acc[key]}
   }, {});


// 投机取巧式
const omit = (obj, uselessKeys) =>
  uselessKeys.reduce((acc, key) => {
    return {...acc, [key]: undefined}
  }, obj)


// 粗暴式
const omit = (obj, uselessKeys) => {
  uselessKeys.forEach(key => {
    delete obj[key]
  })
  return obj
}
  • 几种方法的执行速度比较

执行速度:undefined >map.delete > obj.delete > omit

给对象增加属性