Javascript:我正在尝试使用switch语句将字符串推送到新数组

时间:2017-02-21 05:37:03

标签: javascript arrays switch-statement

这里面临的挑战是:编写一个函数,该函数接收一个水果数组并返回一个可以在此数组中找到的颜色数组。相同颜色的水果将返回相同的值,但不会重复。

例如:

whatFruitColors(['apple', 'orange', 'mango']);
// returns ['red', 'orange']

我试图用switch语句来解决这个问题,因为我想使用" fall-through"处理所有陈述。有人可以告诉我我做错了吗?

    var whatFruitColors = function(fruitArray){
  var fruitColors = [];

    switch(fruitArray){
      case fruitArray.indexOf('pineapple' || 'banana') > -1):
        fruitColors.push('yellow');

      case fruitArray.indexOf('mango' || 'orange') > -1):
        fruitColors.push('orange');

      case fruitArray.indexOf('apple') > -1):
        fruitColors.push('red');

      break;
  }

  console.log(fruitColors);
  return fruitColors;

}

whatFruitColors(['pineapple','banana','apple','mango','orange']);

5 个答案:

答案 0 :(得分:3)

如果你需要比Array.reduce更不优雅的解决方案,那么:

    var whatFruitColors = function (fruitArray) {
        var fruitColors = [];

        for (var i = 0; i < fruitArray.length; i++) {
            var item = fruitArray[i];
            switch (item) {
                case 'pineapple':
                case 'banana':
                    if (fruitColors.indexOf('yellow') === -1) {
                        fruitColors.push('yellow');    
                    }
                    break;
                case 'mango':
                case 'orange':
                    if (fruitColors.indexOf('orange') === -1) {
                        fruitColors.push('orange');
                    }
                    break;
                case 'apple':
                    if (fruitColors.indexOf('red') === -1) {
                        fruitColors.push('red');
                    }
                    break;
            }
        }

        console.log(fruitColors);

        return fruitColors;
    };

    whatFruitColors(['pineapple', 'banana', 'apple', 'mango', 'orange']);

答案 1 :(得分:2)

其他人已经解释了你哪里出错了,但我想我会添加一个答案来表明,有时当你试图创建一个没有重复的数组时,使用普通对象作为工作变量可能更简单然后只需从该对象的最后取出密钥 - 节省必须测试特定项目是否已存在。

如果你有:

fruits['yellow'] = true;

...然后你可以说:

fruits

...根据您的喜好多次,yellow对象仍然只有一个名为true的属性。 (你赋予属性的值可以是任何值,因为关键只是创建属性,但我建议switch,因为它似乎比其他可能的值更合乎逻辑。)

在上下文中(仍然使用.reduce()语句,尽管您可以使用if或一系列var whatFruitColors = function(fruitArray){ var fruitColors = {}; fruitArray.forEach(function(fruit) { switch(fruit){ case 'pineapple': case 'banana': fruitColors['yellow'] = true; break; case 'mango': case 'orange': fruitColors['orange'] = true; break; case 'apple': fruitColors['red'] = true; break; } }); console.log(fruitColors); return Object.keys(fruitColors); } console.log(whatFruitColors(['pineapple','banana','apple','mango','orange']));语句或其他任何答案执行此操作:

&#13;
&#13;
{{1}}
&#13;
&#13;
&#13;

答案 2 :(得分:1)

我认为switch不适合这个。而且我认为你的“堕落”模式肯定会失败:触发的第一个case语句也会执行

你可以使用switch来完成这项工作,但是你必须放弃你的“堕落”,你需要遍历各个成果。

或者,如果您只是想避免任何循环,最直接的解决方案是使用一系列非独占if语句,如下所示:

function whatFruitColors(fruitList) {
    var results = [];

    if(fruitList.indexOf('apple'    ) >= 0 && results.indexOf('red'   ) === -1) fruitList.push('red'   );
    if(fruitList.indexOf('banana'   ) >= 0 && results.indexOf('yellow') === -1) fruitList.push('yellow');
    if(fruitList.indexOf('kiwi'     ) >= 0 && results.indexOf('green' ) === -1) fruitList.push('green' );
    if(fruitList.indexOf('mango'    ) >= 0 && results.indexOf('orange') === -1) fruitList.push('orange');
    if(fruitList.indexOf('orange'   ) >= 0 && results.indexOf('orange') === -1) fruitList.push('orange');
    if(fruitList.indexOf('pineapple') >= 0 && results.indexOf('yellow') === -1) fruitList.push('yellow');

    return results;
}

whatFruitColors(['pineapple','banana','apple','mango','orange']);

这样可行,但坦率地说是原油,并且有很多还原剂代码。此外,保持这一点 - 即添加新的水果,保持水果+颜色关联列表 - 将是痛苦的屁股。

这是Array.reduce完美用例。这是一个更好的解决方案:

function whatFruitColors(fruitList) {
    // a static lookup "table" that declares the color of every fruit
    var FRUIT_COLORS = {
        'apple': 'red',
        'banana': 'yellow',
        'kiwi': 'green',
        'mango': 'orange',
        'orange': 'orange',
        'pineapple': 'yellow'
    };

    return fruitList.reduce(function(foundColors, thisFruit) {
        var thisFruitColor = FRUIT_COLORS[thisFruit];
        if(foundColors.indexOf(thisFruitColor) === -1) {
            foundColors.push(thisFruitColor);
        }

        return foundColors;
    }, []);
}

whatFruitColors(['pineapple','banana','apple','mango','orange']);

答案 3 :(得分:1)

不是你想要的 - 并不像汤姆的解决方案那么优雅,哇 - 但它确实使用switch语句。 (我考虑过将条件放在开关的情况下,但最后只是过滤结果。)

var whatFruitColors = function(fruitArray){
  var fruitColors = [];
    for (let fruit of fruitArray) {
    switch(fruit){
      case 'pineapple':
      case 'banana':
        fruitColors.push('yellow');
            break;
      case 'mango':
      case 'orange':
        fruitColors.push('orange');
            break;
      case 'apple':
        fruitColors.push('red');
            break;
    }
  }
    let reducedFruits = fruitColors.filter((elem, index, self) => {
       return index === self.indexOf(elem);
    });
  console.log(reducedFruits);
  return reducedFruits;

}

whatFruitColors(['pineapple','banana','apple','mango','orange']);

答案 4 :(得分:1)

如果简单的switch语句就足够了,似乎没有真正的理由使用if语句。这将为您提供&#34;直播&#34;你想要的流程,因为它只是一系列的陈述。

此外,在'oneValue' || 'anotherValue'内使用.indexOf不会做您正在尝试做的事情。 fruitArray.indexOf('pineapple' || 'banana')在功能上与fruitArray.indexOf('pineapple')相同。 'banana'部分将被忽略。

&#13;
&#13;
var whatFruitColors = function(fruitArray) {
  var fruitColors = [];

  if (fruitArray.indexOf('pineapple') > -1 ||
      fruitArray.indexOf('banana') > -1) {
    fruitColors.push('yellow');
  }

  if (fruitArray.indexOf('mango') > -1 ||
      fruitArray.indexOf('orange') > -1) {
    fruitColors.push('orange');
  }

  if (fruitArray.indexOf('apple') > -1) {
    fruitColors.push('red');
  }

  console.log(fruitColors);
  return fruitColors;
}

whatFruitColors(['pineapple', 'banana', 'apple', 'mango', 'orange']);
&#13;
&#13;
&#13;

您还可以使用使用.filter.some.map的更清晰且更具可扩展性的实现:

&#13;
&#13;
function whatFruitColors(fruits) {
  var fruitColors = [{
      color: 'red',
      fruits: ['apple']
    },
    {
      color: 'yellow',
      fruits: ['banana', 'pineapple']
    },
    {
      color: 'orange',
      fruits: ['mango', 'orange']
    }
  ];

  return fruitColors.filter(function(item) {
      return item.fruits.some(function(fruit) {
        return fruits.indexOf(fruit) > -1;
      });
    })
    .map(function(item) {
      return item.color;
    });
}

console.log(whatFruitColors(['banana', 'mango', 'orange']));
&#13;
&#13;
&#13;