如何在javascript中获得嵌套数组中值的indexOf位置
How to get indexOf location of a value in nested array in javascript?
免责声明:这个问题和这个问题不一样。
我有一个嵌套数组的例子:var testArray = [
true,
"",
[
1,
{a: 2, b: [3, false]},
[2, []],
null
],
4,
undefined,
[5, "test"],
function() {}
];
如何获取嵌套数组中值的indexOf,如:
testArray.multiIndexOf(null); //Expected result will be [2, 3]
我将解释这里发生了什么。
首先,我们将testArray分解为:
var testArrayExplain = [0, 1, [0, 1, [0, 1], 3], 3, 4, [0, 1], 6];
正如你在这里看到的,这个数组和上面一样:第一层数组的长度为7,然后看看位置#2的值,我们将看到另一个数组嵌套在第一个数组上。如上所述,null
值与位置#3在第一个数组
所以我们将有第一层位置,然后是第二层位置null: [2, 3]
,存储在从第一层到最后一层排序的数组中。
另一个例子:
var testArrayTwo = [1,[2,3,4],5,[6,[7,8],9,10],11,12];
testArrayTwo.multiIndexOf(6); //return [3, 0]
可选:如果一个嵌套数组有两个相同的值,那么获取第一个值的位置,还是一个数组同时存储两个位置?如果值不在嵌套数组,return -1
像indexOf?
我要求太多了吗?这个问题对未来的开发者很重要吗?
可以遍历数组,如果找到所需的项就停止。如果可能的话,查看嵌套数组并继续。
Array.prototype.multiIndexOf = function (value) {
var result;
this.some(function iter(path) {
return function (a, i) {
if (a === value) {
result = path.concat(i);
return true;
};
return Array.isArray(a) && a.some(iter(path.concat(i)));
}
}([]));
return result;
}
var testArray = [true, "", [1, { a: 2, b: [3, false] }, [2, []], null], 4, undefined, [5, "test"], function () { }];
console.log(testArray.multiIndexOf(null));
console.log([1, [2, 3, 4], 5, [6, [7, 8], 9, 10], 11, 12].multiIndexOf(6));
.as-console-wrapper { max-height: 100% !important; top: 0; }
替代@Nina的答案。
作为额外的检查,我添加了
JSON.stringify(array[key]).indexOf(searchVal) > -1
如果value不可用,将忽略递归树。
var testArray = [1, [2, 3, 4], 5, [6, [7, 8], 9, 10], 11, 12]
function findIndex(array, searchVal, pindex) {
var result = -1;
var index = -1;
for (var key in array) {
index++;
if (typeof(array[key]) === "object" &&
JSON.stringify(array[key]).indexOf(searchVal) > -1 &&
findIndex(array[key], searchVal, index) !== -1) {
result = index;
break;
} else if (typeof(item) !== "object" && array[key] === searchVal) {
result = index;
break;
}
}
return pindex || result;
}
var r1 = findIndex(testArray, 2);
var r2 = findIndex(testArray, 3);
var r3 = findIndex(testArray, 8);
console.log("Result: ", r1, r2, r3)
您可以使用以下函数实现您的目标。它允许您以与在数组上使用indexOf
相同的方式使用deepIndexOf
:
[1,[5,[2,"abc"]],3,4].deepIndexOf("abc") //returns [1,1,1]
[1,[5,[2,"abc"]],3,4].deepIndexOf("none") //returns -1
但是它还不能用于数组。然而,它很容易被消耗掉。
Array.prototype.deepIndexOf = function (val) {
for (var i=0; i<this.length; i++) {
if(this[i] == val)
return [i];
var insideIndex = this[i].deepIndexOf ?
this[i].deepIndexOf(val) : -1;
if (insideIndex != -1)
return [i].concat(insideIndex);
}
return -1;
}
document.write([1,[5,[2,"abc"]],3,4].deepIndexOf("abc")
+"<br>");
document.write([1,[5,[2,"abc"]],3,4].deepIndexOf("none"));
相关文章:
- 如何从某个位置顺时针和逆时针循环数组
- 将javascript数组中的项移动到特定位置的有效方法
- 生成ACF标记位置的数组(元素列表后缺少])
- 基于javascript中位置的数组差异
- Javascript删除数组中某个位置之后的项
- 在数组中迭代时的JS循环位置
- 在两个位置显示数组中的随机单词
- javascript递归,按数组位置查找子级
- 检查数组位置是否真的未定义
- 检查值存在于数组位置
- 在数组位置获取并设置cookie值
- 如何访问成员模板中的数组位置
- 递增数组位置
- 返回最低数字的数组位置(非负数)
- 我如何使一个按钮改变Javascript数组位置
- 我如何保存字符串的每个字母在不同的数组位置?并合并回单个字符串
- 下划线-比较两个对象数组(位置)
- for循环中的Ajax不会返回数组位置的正确值,尽管闭包绑定了当前值位置的范围
- 根据对象在Firebase中的数组位置检索对象
- 当使用x作为索引号时.要在函数中显示数组位置,数组返回undefined