如何查找数组中缺失值的索引
How to find the index of a missing value in an array?
我有一个类似的数组
a=[1,2,3,,4,5];
所以现在我想使用indexOf
来查找缺失的值索引,即3
。
检查值是否为undefined
,如以下代码所示:
for ( var i = 0; i < a.length; i++ ) {
if ( typeof a[i] === "undefined" ) {
// do stuff here or break the loop
}
}
更新你也可以这样做:
Array.prototype.indexOfUndefined = function() {
for ( var i = 0; i < this.length; i++ ) {
if ( typeof this[i] === "undefined" ) {
return i;
}
}
}
您需要返回i
,因为i
是当前索引,它将搜索第一个undefined
值。
演示:http://jsfiddle.net/vdyypq6o/5/
不幸的是,跳过此类数组孔**需要ES5数组方法,因此没有indexOf()
或forEach()
会有所帮助。ECMAScript 2015有两个名为find()
和findIndex()
的新方法可以帮助您,但它们还没有得到广泛支持,所以我认为这不是这个问题的好答案。
剩下的是一个很好的旧的索引迭代:
function findHole(a) {
for (var i = 0; i < a.length; i++) {
// check for only `a[i] === undefined` could be faster,
// but is not enough as it will cause false positives
// when array actually contains `undefined` value
// for example, for `a = [1, undefined, , 2]`,
// correct implementation should return `2`, not `1`
if (a[i] === undefined && !a.hasOwnProperty(i)) {
console.log("Found hole at index " + i);
return i;
}
}
return -1;
}
*--请参阅中的步骤9http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.14对于indexOf()
和步骤8http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.19对于需要跳孔的map()
算法
**--当没有为某个索引定义值时,就会在数组中创建一个洞,所以从技术上讲,说a[3]
有null
或undefined
值是不正确的,因为根本没有任何值。但在JavaScript中,当我们试图获得某个对象的未定义属性时,我们得到的是undefined
,这就是为什么a[3] === undefined
是真的。
a = [1,2,3,,4,5];
i = 0;
$.each(a , (function(){
if(a[i]=="") {
alert(i + ":: yes this is null index");
}
i++;
});
您可以将each循环用于此目的。市场上可能有更多的解决方案:P,但这也是一个很好的解决方案。你应该试试这个。
只是添加了另一种方法来实现您的需求-
for ( var i = 0; i < a.length; i++ ) {
if (!a[i]) {
console.log("Null index = ",i);
}
}
你可以试试这个
a=['1','2','3',,'4']
for(var i=0;i<a.length;i++)
{
if( a.indexOf(a[i])==-1)
// if(typeof a[i] == 'undefined')
alert("Index-->"+i)
}
reduce函数的另一种方法,获取所有遗漏的值。
function findMissed(arr){
var result = arr.reduce(function(acc,el,index){
if(index - acc.cur > 1) {
for(var i=acc.cur+1;i < index;i++){
acc.res.push(i);
}
}
acc.cur = index;
return acc;
},{cur:-1,res:[]});
var missed = result.res;
if(result.cur !== arr.length){
for(var i=result.cur+1;i<arr.length;i++){
missed.push(i);
}
}
return missed;
}
function findMissed(arr) {
var result = arr.reduce(function(acc, el, index) {
if (index - acc.cur > 1) {
for (var i = acc.cur + 1; i < index; i++) {
acc.res.push(i);
}
}
acc.cur = index;
return acc;
}, {
cur: -1,
res: []
});
var missed = result.res;
if (result.cur !== arr.length) {
for (var i = result.cur + 1; i < arr.length; i++) {
missed.push(i);
}
}
return missed;
}
var a = [1, 2, 3, , 4, 5];
var missed = findMissed(a);
printRes(a, missed);
console.log(missed)
a = [1, , 3, , 5, , 7, , 9]
var missed = findMissed(a);
console.log(missed)
printRes(a, missed);
a = [1, ,,,]
var missed = findMissed(a);
console.log(missed)
printRes(a, missed);
a = [,,,]
var missed = findMissed(a);
console.log(missed)
printRes(a, missed);
a = [,,,2]
var missed = findMissed(a);
console.log(missed)
printRes(a, missed);
function printRes(src, res) {
document.getElementById('res').innerHTML += JSON.stringify(src) + '<br/>' + JSON.stringify(res) + '<br/>';
}
<div id="res"></div>
假设有两个您知道不在数据中的字符(例如磅号#
和管道|
(,您可以使用以下一行:
Math.max(-1, [].concat(9, a, 9).join('#|#').split('|').indexOf('##')-1);
9
只是占位符,以防丢失的元素位于开头或结尾。(但请注意,在JavaScript中,数组末尾的一个额外逗号会被忽略,因此无法检查这种情况。(
代码段
console.clear();
//hole at beginning:
a= [,1,2,3,4,5];
console.log(Math.max(-1, [].concat(9, a, 9).join('#|#').split('|').indexOf('##')-1)); //0
//hole in middle:
a= [1,2,3,,4,5];
console.log(Math.max(-1, [].concat(9, a, 9).join('#|#').split('|').indexOf('##')-1)); //3
//an extra comma at the end of an array is ignored in JavaScript:
a= [1,2,3,4,5,];
console.log(Math.max(-1, [].concat(9, a, 9).join('#|#').split('|').indexOf('##')-1)); //-1
//only the last comma is ignored:
a= [1,2,3,4,5,,];
console.log(Math.max(-1, [].concat(9, a, 9).join('#|#').split('|').indexOf('##')-1)); //5
创建这样的数组a=[1,2,3,,4,5];
将导致a[3]
为undefined
而不是null
。
CCD_ 25或CCD_。将a[3]
设置为null
也将不起作用,因为后面的所有内容都将向左移动。
我建议您创建自己的数组方法来搜索每个undefined
值。
var arr = [1,2,3,,4,5];
Array.prototype.findMissingValues = function(callback){
for(var i = 0; i < this.length; i++){
if(typeof this[i] === 'undefined'){
if(typeof callback != 'undefined'){
callback.apply(this, [i, this[i]]);
}
}
}
}
arr.findMissingValues(function(index, value){
alert(value);
});
- 是索引数组文字的好做法
- jQuery ajax请求,将索引数组作为关键字字符串
- Javascript中的名称索引-数组/对象
- 如何在对象中按值创建排序索引数组
- 提取索引数组中的整数值
- 来自 jsp 和 javascript 中的请求属性的对象索引数组
- 单击导航索引数组时发出双重警报
- 以编程方式声明基于索引数组的变量(使用谷歌网站列表页面)
- 索引数组 JavaScript 中索引的搜索值
- 根据值从索引数组中删除元素
- 如何检查名称索引数组中有多少个特定结果
- 从 JavaScript 数组中删除索引数组
- 创建一个索引数组,该数组的索引值为 JavaScript 中最常见的数组值
- JavaScript 如何用数组解释索引数组
- 在javascript中向索引数组添加超链接
- 非数字索引数组的长度
- JavaScript-偶数索引数组元素乘以2,奇数索引乘以3
- Javascript-使用索引数组访问数组的元素
- 从数组中删除索引数组
- 在javascript中用索引数组索引一个数组的数组