在数组元素上使用delete运算符与使用array.splice方法有什么区别?

例如:

myArray = ['a', 'b', 'c', 'd'];

delete myArray[1];
//  or
myArray.splice (1, 1);

如果我可以像删除对象那样删除数组元素,为什么还要使用拼接方法?


当前回答

delete的行为类似于非真实情况,它只是删除项,但数组长度保持不变:

来自节点终端的示例:

> var arr = ["a","b","c","d"];
> delete arr[2]
true
> arr
[ 'a', 'b', , 'd', 'e' ]

这里有一个函数,使用slice()按索引删除数组中的项,它将arr作为第一个参数,将要删除的成员的索引作为第二个参数。如您所见,它实际上删除了数组的成员,并将数组长度减少1

function(arr,arrIndex){
    return arr.slice(0,arrIndex).concat(arr.slice(arrIndex + 1));
}

上面的函数所做的是将索引之前的所有成员和索引之后的所有成员连接在一起,并返回结果。

下面是一个使用上述函数作为节点模块的示例,查看终端将非常有用:

> var arr = ["a","b","c","d"]
> arr
[ 'a', 'b', 'c', 'd' ]
> arr.length
4 
> var arrayRemoveIndex = require("./lib/array_remove_index");
> var newArray = arrayRemoveIndex(arr,arr.indexOf('c'))
> newArray
[ 'a', 'b', 'd' ] // c ya later
> newArray.length
3

请注意,这不会在一个数组中使用重复数据,因为indexOf(“c”)只会得到第一次出现,并且只会拼接并删除它找到的第一个“c”。

其他回答

最简单的方法可能是

var myArray = ['a', 'b', 'c', 'd'];
delete myArray[1]; // ['a', undefined, 'c', 'd']. Then use lodash compact method to remove false, null, 0, "", undefined and NaN
myArray = _.compact(myArray); ['a', 'c', 'd'];

希望这有帮助。参考:https://lodash.com/docs#compact

我有两种方法。

简单的一个:

arr = arr.splice(index,1)

第二个:

arr = arr.filter((v,i)=>i!==index)

第二种方法的优点是可以删除一个值(所有值,而不是像大多数情况一样只删除第一个实例)

arr = arr.filter((v,i)=>v!==value)

delete将删除对象属性,但不会重新索引数组或更新其长度。这使得它看起来像是未定义的:

> myArray = ['a', 'b', 'c', 'd']
  ["a", "b", "c", "d"]
> delete myArray[0]
  true
> myArray[0]
  undefined

请注意,它实际上没有设置为值undefined,而是从数组中删除了属性,使其看起来未定义。Chrome开发工具在记录阵列时打印为空,从而明确了这一区别。

> myArray[0]
  undefined
> myArray
  [empty, "b", "c", "d"]

splice(start,deleteCount)实际上删除了元素,重新索引数组,并更改其长度。

> myArray = ['a', 'b', 'c', 'd']
  ["a", "b", "c", "d"]
> myArray.splice(0, 2)
  ["a", "b"]
> myArray
  ["c", "d"]

IndexOf也接受引用类型。假设以下场景:

var arr=[{项:1},{项2},{项3}];var发现=发现(2,3)//伪代码:将返回〔{item:2},{item:3}〕var l=基础长度;而(l-){var索引=arr.indexOf(找到[l])arr.splice(索引,1);}控制台日志(arr.length)//1.

不同之处:

var item2 = findUnique(2); //will return {item: 2}
var l = arr.length;
var found = false;
  while(!found && l--) {
  found = arr[l] === item2;
}

console.log(l, arr[l]);// l is index, arr[l] is the item you look for

可能还值得一提的是,拼接仅适用于阵列。(不能依赖对象财产来遵循一致的顺序。)

要从对象中删除键值对,实际上需要删除:

delete myObj.propName;     // , or:
delete myObj["propName"];  // Equivalent.