我有这样一个阵列:
var array = [ [1,2] , [2,2,2] , 3 , [3,4] ];
所以我想使用indexOf来拼接元素。
示例:
var index = array.indexOf( [2,2,2] );
array.splice(index, 1)
Expect =>
array = [ [1,2] , 3 , [3,4] ]
但问题是索引返回-1(假值)..如何解决?
答案 0 :(得分:6)
问题是,你有两个具有相同基元的数组,但数组不相等。
比较适用于对象而不是内部的值。
console.log([2, 2, 2] === [2, 2, 2]); // false
var array = [2, 2, 2];
console.log(array === array); // true

如果使用对象的相同引用搜索相同数组,则可获得正确的索引。
var search = [2, 2, 2], // array to serach for
array = [[1, 2], search, 3, [3, 4]], // array with search array
index = array.indexOf(search); // get the index
array.splice(index, 1);
console.log(array); // [[1, 2], 3, [3, 4]]

在ES5中,您可以搜索索引并使用搜索对象的字符串版本来检查Array#some
。
var array = [[1, 2], [2, 2, 2], 3, [3, 4]],
search = [2, 2, 2],
index = -1;
array.some(function(a, i) {
if (JSON.stringify(a) === JSON.stringify(search)) {
index = i;
return true;
}
});
if (index !== -1) {
array.splice(index, 1);
}
console.log(array);

ES6与Array#findIndex
var array = [[1, 2], [2, 2, 2], 3, [3, 4]],
search = [2, 2, 2],
index = array.findIndex(a => JSON.stringify(a) === JSON.stringify(search));
if (index !== -1) {
array.splice(index, 1);
}
console.log(array)

答案 1 :(得分:0)
如果您可以使用库,则可以使用公开lodash
功能的reject
库。
这是一个片段:
var array = [ [1,2] , [2,2,2] , 3 , [3,4] ];
var result = _.reject(array, [2,2,2]);
console.log(result);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
答案 2 :(得分:0)
var array = [[1, 2], [2, 2, 2], 3, [3, 4]];
var index = array.findIndex(a => JSON.stringify(a) === "[2,2,2]");
alert(index);
if (index > -1) {
array.splice(index, 1);
}
alert(array)
希望这有帮助!
答案 3 :(得分:0)
indexOf 不起作用,因为它使用严格相等,因此除非您对要查找的数组有引用,否则无法在数组中找到数组。
作为替代方案,您可以使用普通的旧版本3 进行循环并比较字符串化的值:
var array = [ [1,2] , [2,2,2] , 3 , [3,4] ];
function findIndex(arr, value) {
for ( var i=0, value=String(value), iLen=arr.length; i<iLen; i++) {
if (String(arr[i]) == value) return i;
}
return -1;
}
console.log(findIndex(array, [2,2,2])); // 1