Javascript数组过滤器执行函数

时间:2017-08-05 02:54:32

标签: javascript arrays

我有一个包含两个值的数组,(1或2)和(a,b,c或d)。根据这两个值,将执行某个数学函数。该函数采用单独的输入数字并将其乘以常数,但该部分不是必需的。

基本上用户提供了3个值,我已经删除了一个值,即常数',所以我留下2个值来确定正确的乘数常数'

我正在寻找比组合数组并在switch语句中运行所有可能的解决方案更容易和更强大的东西。将来有可能为阵列提供新的变量。

let k = 5;
let input = [2, 'c'];

if (input.join().includes('1')) {
  if (input.join().includes('a')) {
    return k * 10;
  };
  else if (input.join().includes('b')) {
    return k * 11;
  };
  else if (input.join().includes('c')) {
    return k * 12;
  };
  else if (input.join().includes('d')) {
    return k * 13;
  };
};

else if (input.join().includes('2')) {
  if (input.join().includes('a')) {
    return k * 14;
  };
  else if (input.join().includes('b')) {
    return k * 15;
  };
  else if (input.join().includes('c')) {
    return k * 16;
  };
  else if (input.join().includes('d')) {
    return k * 17;
  };
};

基本上我现在有类似的东西。 inputk由用户提供,但不一定按任何顺序排列,因此我无法假设input[1]会给我(a,b,c或d) )。

3 个答案:

答案 0 :(得分:1)

var mathFunc = getMathFunc([2, 'b']);
mathFunc(2); // 80

function getMathFunc(arr) {
  var inputString = arr.join('');

  var mathFuncs = {
    1: {
      a: mathFunc10,
      b: mathFunc20
    },
    2: {
      a: mathFunc30,
      b: mathFunc40
    }
  };

  for (var numKey in mathFuncs) {
    if (inputString.includes(numKey)) {
      var numObj = mathFuncs[numKey];

      for (var letterKey in numObj) {
        if (inputString.includes(letterKey)) {
          return numObj[letterKey];
        }
      }
    }
  }

  function mathFunc10(num) {
    return 10 * num;
  }

  function mathFunc20(num) {
    return 20 * num;
  }

  function mathFunc30(num) {
    return 30 * num;
  }

  function mathFunc40(num) {
    return 40 * num;
  }
}

答案 1 :(得分:1)

我同意帕特里克的评论,即你在这里尝试做的事情有点神秘。我也注意到你的评论:

  

我可以添加:var mathFuncs = { 1: 'one': { a: mathFunc10, b: mathFunc20 }

您是说您希望能够互换地接受1one的输入值吗?

你可以非常简单地做到这一点。下面的calculate()函数生成input数组的副本,如果它是数字名称之一,则将每个元素转换为数字,然后对此数组进行排序以使其按照一致的顺序排列(数字排序之前字母)。接下来,我们选择要使用的乘数列表(1或2),最后得到特定的乘数(a-d)来计算返回值。如果输入数组与任何内容都不匹配,我们将返回NaN

const numbers = {
    'one': 1,
    'two': 2,
};

const multipliers = {
    1: { a:10, b:11, c:12, d:13 },
    2: { a:14, b:15, c:16, d:17 },
};

function calculate( k, input ) {
    const convert = n => numbers[ n.toString().toLowerCase() ] || n;
    const sorted = input.map( convert ).sort();
    const list = multipliers[ sorted[0] ];
    if( ! list ) return NaN;
    const multiplier = list[ sorted[1] ];
    return multiplier == null ? NaN : k * multiplier;
}

function test( k, input) {
    console.log( k, input.toString(), calculate( k, input ) );
}

test( 5, [ 1, 'a' ] );  // 50
test( 5, [ 'a', 1 ] );  // 50
test( 5, [ 'a', 'one' ] );  // 50
test( 5, [ 2, 'c' ] );  // 80
test( 5, [ 'two', 'c' ] );  // 80
test( 5, [ 2, 'e' ] );  // NaN
test( 5, [ 3, 'a' ] );  // NaN
test( 5, [ 'three', 'a' ] );  // NaN

答案 2 :(得分:1)

If the logic of the returned value is like in your example, then this will do it:

const ref = { 1: 10, 2: 14, a: 0, b: 1, c: 2, d: 3 },
      calc = (k, input) => k * input.reduce( (res, x) => res + ref[x], 0 );

// Sample calls:
console.log([
    calc(5, [2, 'c']), // 80
    calc(5, ['c', 2]), // 80
    calc(5, ['a', 1]), // 50
    calc(5, [2, 'b']), // 75
    calc(5, [3, 'd']), // NaN
    calc(5, ['e', 2]), // NaN
]);

Of course, if the logic is more complex in other cases, then you'll have to implement that logic in your function and/or the proposed ref mapping object. If the "variables" are more interdependent, you may even need several mapping objects.