检查随机n维数组Javascript中是否存在值

时间:2015-02-24 10:29:12

标签: javascript arrays multidimensional-array

我正在编写一个函数来检查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']]]]]]]]]]]]]]]]]]]]]]]]]];

2 个答案:

答案 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#someArray.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;
&#13;
&#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..
}

适用于任何浏览器