猿问

在多维数组中搜索(算法)

问题


编写一个函数,获取序列和值,并根据变量是否存在于多维序列中返回真/假。


例子:


locate(['a','b',['c','d',['e']]],'e'); // should return true

locate(['a','b',['c','d',['e']]],'a'); // should return true

locate(['a','b',['c','d',['e']]],'f'); // should return false

我的解决方案似乎可行,但 Code Wars 说:“arr.flat 不是函数。


我使用免费的代码营浏览器来运行和测试我的代码,我的控制台日志表明我已经让它工作了,但是 Code Wars 说 arr.flat 不是一个函数。这是我的代码:


var locate = function(arr, value){

  let count = 0;

  arr.flat().map((item)=>{

    value == item ? count++ : count;

  });


  return count > 0 ? true : false;

}

我的问题


我的代码是否正确?如果不是,那有什么问题。如果是这样,为什么 Code Wars 会抛出错误?


jeck猫
浏览 188回答 4
4回答

炎炎设计

您实际上并不需要.flat这个(尽管这将允许最优雅的解决方案const locate = (arr, value) => arr.flat().includes(value);)。这是一个使用普通for循环的简单递归解决方案:const locate = function(arr, value) {&nbsp; for(let i = 0; i < arr.length; i++) {&nbsp; &nbsp; if (Array.isArray(arr[i]) {&nbsp; &nbsp; &nbsp; if (locate(arr[i], value) {&nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; }&nbsp;&nbsp; &nbsp; }&nbsp; &nbsp; if (arr[i] === value) {&nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; }&nbsp;&nbsp; }&nbsp; return false;}&nbsp;

慕斯709654

由于flat您的环境支持,请编写自己的平面方法并使用includesconst flat = (arr, res = []) => (&nbsp; arr.forEach((item) =>&nbsp; &nbsp; Array.isArray(item) ? flat(item, res) : res.push(item)&nbsp; ),&nbsp; res);const locate = (arr, value) => flat(arr).includes(value);console.log(locate(["a", "b", ["c", "d", ["e"]]], "e"));console.log(locate(["a", "b", ["c", "d", ["e"]]], "a"));console.log(locate(["a", "b", ["c", "d", ["e"]]], "f"));

SMILET

它似乎在这里工作。因此,您正在测试的浏览器可能不支持flat()var locate = function(arr, value){&nbsp; let count = 0;&nbsp; arr.flat().map((item)=>{&nbsp; &nbsp; value == item ? count++ : count;&nbsp; });&nbsp; return count > 0 ? true : false;}console.log(locate(['a','b',['c','d',['e']]],'e')); // should return trueconsole.log(locate(['a','b',['c','d',['e']]],'a')); // should return trueconsole.log(locate(['a','b',['c','d',['e']]],'f')); // should return false

慕哥9229398

您可以采用递归方法,在查找时短路。function locate(array, value) {&nbsp; &nbsp; return array.some(v => Array.isArray(v) && locate(v, value) || v === value);}console.log(locate(['a', 'b', ['c', 'd', ['e']]], 'e')); // trueconsole.log(locate(['a', 'b', ['c', 'd', ['e']]], 'a')); // trueconsole.log(locate(['a', 'b', ['c', 'd', ['e']]], 'f')); // false
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答