我正在编写一个函数来检查n维数组是否具有某个值:
function checkVal(array, value){
if (value exists) {
return true;
} else {
return false;
}
}
我的问题是我希望这个函数适用于任何随机数组,无论其维数或元素类型如何。我试图首先压平阵列,但只设法做了几个维度。
编辑: 可能的数组的一些示例:
var arr1 = ['1','3',['a','b'],'4,5']
;
var arr2 = ['a','b',['c','d',['e',['e',['e',['e',['e',['e',['e',['e',['e',['e',['f',['f',['f',['f',['f',['f',['g',['g',['g',['g',['g',['g',['g',['h']]]]]]]]]]]]]]]]]]]]]]]]]];
答案 0 :(得分:2)
没有必要压扁阵列,这只是额外的工作。你需要的是一个递归函数:
function checkVal(array, value) {
// `Array#some` loops through the array until the iterator
// function returns true; it returns true if the iterator
// does at some point, false otherwise
return array.some(function(entry) {
// If this entry in the array is an array, recurse
if (Array.isArray(entry)) {
return checkVal(entry, value);
}
// It isn't, do an equality check
return entry === value;
});
}
Array#some
和Array.isArray
都是ES5函数,因此存在于任何现代浏览器中,并且两者都可以为IE8等旧版本进行填充/填充。或者,当然,上面的内容可以用无聊的for
循环和旧的Object.prototype.toString.call(entry) === "[object Array]"
测试来重写,以确定是否有数组。
请注意,我已使用===
进行相等性检查。如果你需要一些更复杂的东西,比如对象等价而不是身份等,那就进行改变。
示例/基本测试:
function checkVal(array, value) {
// `Array#some` loops through the array until the iterator
// function returns true; it returns true if the iterator
// does at some point, false otherwise
return array.some(function(entry) {
// If this entry in the array is an array, recurse
if (Array.isArray(entry)) {
return checkVal(entry, value);
}
// It isn't, do an equality check
return entry === value;
});
}
snippet.log(checkVal(['a', 'b', 'c'], 'b')); // true
snippet.log(checkVal(['a', 'b', 'c'], 'd')); // false
snippet.log(checkVal([['a'], ['b', 'c']], 'c')); // true
snippet.log(checkVal([['a'], ['b', 'c']], 'd')); // false
snippet.log(checkVal([['a'], [['b', ['c']]]], 'c')); // true
snippet.log(checkVal([['a'], [['b', ['c']]]], 'd')); // false

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
答案 1 :(得分:0)
您需要一个递归函数来检入数组的所有子项
function searchValue(arr, val){
// found another array
if(arr instanceof Array){
for(var i=0; i<arr.length; i++){
if(searchValue(arr[i],val)){
return true; // stop on first valid result
}
}
return false;
}else{
// found a leaf
return arr == val; // <-- if you want strict check, use ===
}
}
if(searchValue(myArray, 'my variable')){
// do something..
}
适用于任何浏览器