我有以下问题。我必须解决一个问题。
水果或蔬菜写一个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;
}
然后,黄瓜变成了蔬菜,但苹果未定义?我有点困惑,所以如果有人解释我为什么会这样,我会很高兴的。谢谢。
答案 0 :(得分:5)
你在那里做了大量嵌套的不必要的for loop
。任务非常简单
输入来自一个字符串元素的数组, fruit 的名称。 输出应打印到控制台。
您只需获取第一个inputArr
值,即字符串,并检查其值是否实际位于fruits
,vegetables
或其他{ {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' :
'unknown';
中是否存在val
,如果存在,则返回'果实'或运行 2 fruits
中是否存在val
,如果存在,则返回'蔬菜'或运行 3 此操作等于,
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)
<强>建议:强>
检查当前项目是否为水果,只有当您确定它不是水果时,检查它是否是蔬菜。
仅在确认当前项目既不是水果也不是蔬菜时返回unknown
。
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#indexOf
和Array#map
现在,您可以使用函数式编程方法编写相同的内容。您可以使用Array.prototype.map
将inputArr
的每个元素应用于此函数,就像这样
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";
}
根据评论更新了答案
不知道为什么,但它仅适用于数组的0索引
原因是你在循环中正在返回值。所以它永远不会跑到最后。要解决这个问题,请将return "unknown";
置于循环之外。
将代码简化为永不与之混淆是一种好习惯。例如,您可以写如下:
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;