Javascript只读取嵌套for循环中的第一个元素(来自数组)

时间:2016-12-27 07:06:16

标签: javascript arrays for-loop statements

我有以下问题。我必须解决一个问题。

  

水果或蔬菜写一个JS函数来打印“水果”,“蔬菜”   或“未知”,具体取决于输入字符串。

     
      
  • 水果有:香蕉,苹果,猕猴桃,樱桃,柠檬,葡萄,桃子

  •   
  • 蔬菜有:番茄,黄瓜,胡椒,洋葱,大蒜,香菜

  •   
  • 所有其他人都不知道

         

    输入来自一个字符串元素的数组,即   水果。输出应打印到控制台。

  •   
     

示例:输入['banana']输出:fruit
  示例:input ['cucumber']输出:vegetable
  示例:input ['pizza']输出:未知

我尝试过这样的事情。

function fruitOrVegetable(inputArr) {
  var fruits = ['banana', 'apple', 'kiwi', 'cherry', 'lemon', 'grapes', 'peach'];
  var vegetables = ['tomato', 'cucumber', 'pepper', 'onion', 'garlic', 'parsley'];

  for (var i = 0; i < inputArr.length; i++) {
    for (var j = 0; j < fruits.length; j++) {
      for (var k = 0; k < vegetables.length; k++) {
        if (inputArr[i] === fruits[j]) {
          return ' fruit ';
        } else if (inputArr[i] === vegetables[k]) {
          return 'vegetable';
        } else {
          return 'unknown';
        }
      }
    }
  }
}

console.log(fruitOrVegetable(['tomato'])); //Returns vegetable
console.log(fruitOrVegetable(['banana'])); //Returns fruit
console.log(fruitOrVegetable(['cucumber'])); //Returns unknown
console.log(fruitOrVegetable(['pizza'])); // Returns unknown
console.log(fruitOrVegetable(['appple'])); //Returns unknown

不知道为什么,但它仅适用于数组的0索引,例如,'番茄'它返回蔬菜,但如果我尝试其他蔬菜,它会返回未知。如果我删除最后一个语句

else{
 return false;
}

然后,黄瓜变成了蔬菜,但苹果未定义?我有点困惑,所以如果有人解释我为什么会这样,我会很高兴的。谢谢。

7 个答案:

答案 0 :(得分:5)

你在那里做了大量嵌套的不必要的for loop。任务非常简单

  

输入来自一个字符串元素的数组, fruit 的名称。   输出应打印到控制台。

您只需获取第一个inputArr值,即字符串,并检查其值是否实际位于fruitsvegetables或其他{ {1}}。

类似的东西,

unknown

修改

让我们打破上面的代码,

function fruitOrVegetable(inputArr) {
    var fruits = ['banana', 'apple', 'kiwi', 'cherry', 'lemon', 'grapes', 'peach'];
    var vegetables = ['tomato', 'cucumber', 'pepper', 'onion', 'garlic', 'parsley'];

    var val = inputArr[0];

    return fruits.indexOf(val) !== -1 ? 'fruit' : vegetables.indexOf(val) !== -1 ? 'vegetables' : 'unknown';
}

然后回来,

  

1 // This is to grab the string from the first value in `inputArr` and store in `val`. var val = inputArr[0];

     

2 fruits.indexOf(val) !== -1 ? 'fruit'

     

3 vegetables.indexOf(val) !== -1 ? 'vegetables' :

  1. 检查'unknown';中是否存在val,如果存在,则返回'果实'或运行 2
  2. 检查fruits中是否存在val,如果存在,则返回'蔬菜'或运行 3
  3. 返回'undefined'
  4. 此操作等于,

    vegetables

    更多信息:

    if (fruits.indexOf(val) !== -1) { return 'fruit'; } else if (vegetables.indexOf(val) !== -1) { return 'vegetables'; } else { return 'unknown'; } 是条件(三元)运算符。 (Read more here)。评估表达式非常方便

    e.g。

    ?:

    var myval = 1; console.log(myval ? 'true' : 'false'); // true myval = false; console.log(myval ? 'true' : 'false'); // false 是一个数组本机函数,您可以检查数组中值的索引。 (Read more here

    e.g。

    indexOf

答案 1 :(得分:2)

<强>建议:

  1. 检查当前项目是否为水果,只有当您确定它不是水果时,检查它是否是蔬菜。

  2. 仅在确认当前项目既不是水果也不是蔬菜时返回unknown

  3. function fruitOrVegetable(inputArr) {
      var fruits = ['banana', 'apple', 'kiwi', 'cherry', 'lemon', 'grapes', 'peach'];
      var vegetables = ['tomato', 'cucumber', 'pepper', 'onion', 'garlic', 'parsley'];
    
      var result = [];
      for (var i = 0; i < inputArr.length; i++) {
    
        var isFruit = false;
        var isVegetable = false;
    
        for (var j = 0; j < fruits.length; j++) {
          if (inputArr[i] === fruits[j]) {
            result.push('fruit');
            isFruit = true;
            break;
          }
        }
    
        if (isFruit) {
          // skip rest of the body of the loop as it is a Fruit
          continue;
        }
    
        for (var j = 0; j < vegetables.length; j++) {
          if (inputArr[i] === vegetables[j]) {
            result.push('vegetable');
            isVegetable = true;
            break;
          }
        }
    
        if (isVegetable === false) {
          // at this point we know its neither a fruit nor a vegetable
          result.push('unknown');
        }
    
      }
      return result;
    }
    
    console.log(fruitOrVegetable(['tomato', 'banana', 'cucumber', 'pizza', 'apple']));
    // [ 'vegetable', 'fruit', 'vegetable', 'unknown', 'fruit' ]
    

    Array#indexOf

    的改进

    JavaScript Arrays附带了许多内置方法,这些方法有助于进行基本的排序和搜索。您可以使用Array.prototype.indexOf查找数组中元素的索引。如果找不到,它将返回-1。如果我们用这些信息重写,

    function fruitOrVegetable(inputArr) {
      var fruits = ['banana', 'apple', 'kiwi', 'cherry', 'lemon', 'grapes', 'peach'];
      var vegetables = ['tomato', 'cucumber', 'pepper', 'onion', 'garlic', 'parsley'];
    
      var result = [];
      for (var i = 0; i < inputArr.length; i += 1) {
        if (fruits.indexOf(inputArr[i]) !== -1) {
          result.push('fruit');
        } else if (vegetables.indexOf(inputArr[i]) !== -1) {
          result.push('vegetable');
        } else {
          result.push('unknown');
        }
      }
      return result;
    }
    
    console.log(fruitOrVegetable(['tomato', 'banana', 'cucumber', 'pizza', 'apple']));
    // [ 'vegetable', 'fruit', 'vegetable', 'unknown', 'fruit' ]
    

    Array#indexOfArray#map

    的改进

    现在,您可以使用函数式编程方法编写相同的内容。您可以使用Array.prototype.mapinputArr的每个元素应用于此函数,就像这样

    function fruitOrVegetable(inputArr) {
      var fruits = ['banana', 'apple', 'kiwi', 'cherry', 'lemon', 'grapes', 'peach'];
      var vegetables = ['tomato', 'cucumber', 'pepper', 'onion', 'garlic', 'parsley'];
    
      return inputArr.map(function(currentItem) {
        if (fruits.indexOf(currentItem) !== -1) {
          return 'fruit';
        } else if (vegetables.indexOf(currentItem) !== -1) {
          return 'vegetable';
        }
        return 'unknown';
      });
    }
    
    console.log(fruitOrVegetable(['tomato', 'banana', 'cucumber', 'pizza', 'apple']));
    // [ 'vegetable', 'fruit', 'vegetable', 'unknown', 'fruit' ]
    

答案 2 :(得分:1)

function fruitOrVegetable(inputArr) {
  var fruits = ['banana', 'apple', 'kiwi', 'cherry', 'lemon', 'grapes', 'peach'];
  var vegetables = ['tomato', 'cucumber', 'pepper', 'onion', 'garlic', 'parsley'];
  
  if(inputArr === undefined || !inputArr.length) return 'unknown';

  if(fruits.indexOf(inputArr[0]) !== -1) return 'fruit';
  if(vegetables.indexOf(inputArr[0]) !== -1) return 'vegetable';
  return 'unknown';
}

console.log(fruitOrVegetable(['banana']));
console.log(fruitOrVegetable(['tomato']));
console.log(fruitOrVegetable(['xxx']));
console.log(fruitOrVegetable([]));
console.log(fruitOrVegetable());

答案 3 :(得分:1)

简答:您错放了return "unknown"。考虑一下:

function fruitOrVegetable(inputArr) {
 var fruits = ['banana', 'apple', 'kiwi', 'cherry', 'lemon', 'grapes', 'peach'];
 var vegetables = ['tomato', 'cucumber', 'pepper', 'onion', 'garlic', 'parsley'];

for (var i = 0; i < inputArr.length; i++) {
  for (var j = 0; j < fruits.length; j++) {
    for (var k = 0; k < vegetables.length; k++) {
      if (inputArr[i] === fruits[j]) {
        return ' fruit ';
      } else if (inputArr[i] === vegetables[k]) {
        return 'vegetable';}
      }
    }
  }
return "unknown";
}

根据评论更新了答案

  1.   

    不知道为什么,但它仅适用于数组的0索引

  2. 原因是你在循环中正在返回值。所以它永远不会跑到最后。要解决这个问题,请将return "unknown";置于循环之外。

    1. 一般来说,你已经搞乱了循环,应该简化代码。只要您认为自己的代码更好,就可以提出code review,但是您不知道如何做到这一点。
    2. 将代码简化为永不与之混淆是一种好习惯。例如,您可以写如下:

       function isVegetable(inputArr)
       {
          var vegetables = ['tomato', 'cucumber', 'pepper', 'onion', 'garlic', 'parsley'];        
      
         for (var i = 0; i < inputArr.length; i++) {
           for (var k = 0; k < vegetables.length; k++) {
              if (inputArr[i] === vegetables[k]) {
                return true;
              }
            }
          }
        return false;
        }
      
      
       function isFruit(inputArr)
       {
            var fruits = ['banana', 'apple', 'kiwi', 'cherry', 'lemon', 'grapes', 'peach'];
      
          for (var i = 0; i < inputArr.length; i++) {
          for (var k = 0; k < fruits.length; k++) {
              if (inputArr[i] === fruits[k]) {
                  return true;
                  }
              }
           }
          return false;
       }
      
       function fruitOrVegetable(inputArr)
       {
           if(isVegetable(inputArr)) return "vegetable";  
           if(isFruit(inputArr)) return "fruit";
           return "unknown";
       }
      

答案 4 :(得分:0)

首先return vegetable是它仅用于索引0的原因。因为在第一次循环之后它返回一个值并且函数结束。而是在开始时初始化outputArray并将值设置为该数组outputArray[i] = 'veg'并在结尾设置return outputArray。下一步是不要在彼此之间嵌套过多的循环。取而代之的是在大型循环中单独检查蔬菜或水果:
for() {...} for() {...} Sorry抱歉无法完成代码,因为我是从手机写的< / p>

答案 5 :(得分:0)

你可以尝试这种方式,如果它更适合你: -

function fruitOrVegetable(inputArr) {
  var fruits = ['banana', 'apple', 'kiwi', 'cherry', 'lemon', 'grapes', 'peach'];
  var vegetables = ['tomato', 'cucumber', 'pepper', 'onion', 'garlic', 'parsley'];

  if ( fruits.indexOf( inputArr[0] ) > -1 ){
     return 'fruits';
  }else if ( vegetables.indexOf( inputArr[0] ) > -1 ){
     return 'vegetable';
  }else{
     return 'unknown';
  }
}

答案 6 :(得分:0)

像这样修改你的代码,它将工作文件。

function fruitOrVegetable(inputArr) {

CREATE TABLE mails (MAIL VARCHAR(MAX))
INSERT INTO mails VALUES ('RAM@GMAIL.COM')
INSERT INTO mails VALUES ('RAM@YAHOO.COM')

SELECT SUBSTRING((SUBSTRING(MAIL,CHARINDEX('@',MAIL)+1,LEN(MAIL))),0,CHARINDEX('.',(SUBSTRING(MAIL,CHARINDEX('@',MAIL)+1,LEN(MAIL))))) FROM mails

结果:

fruitOrVegetable([&#39;番茄&#39;]); &#34;蔬菜&#34; fruitOrVegetable([&#39;香蕉&#39;]); &#34;水果&#34;

fruitOrVegetable([&#39; QWE&#39;]); &#34;未知&#34;