如何使相同的模式代码更简洁

时间:2019-07-31 17:30:28

标签: javascript reactjs

我希望这些代码可以更简洁,但我不知道该怎么做。

函数2〜4具有相同的模式,希望可以减少代码,

如果我的“或”和“与”过多,是否有任何方法可以使其更清洁?



const statusFilter2 = (data1, data2) => {
    if (data1 === 'error' || data2 === 'error') {
        return 'error'
    } else if (data1 === 'C' || C === 'C') {
        return 'A'
    } else if (data1 === 'B' || data2 === 'B') {
        return 'B'
    } else {
        return 'C'
    }
}

const statusFilter3 = (data1, data2, data3) => {

    if (data1 === 'error' || data2 === 'error' || data3 === 'error') {
        return 'error'
    } else if (data1 === 'C' || data2 === 'C' || data3 === 'C') {
        return 'C'
    } else if (data1 === 'B' || data2 === 'B' || data3 === 'B') {
        return 'B'
    } else {
        return 'A'
    }
}


const statusFilter4 = (data1, data2, data3, data4) => {
    if (data1 === 'error' || data2 === 'error' || data3 === 'error' || data4 === 'error') {
        return 'error'
    } else if (data1 === 'C' || data2 === 'C' || data3 === 'C' || data4 === 'C') {
        return 'C'
    } else if (data1 === 'B' || data2 === 'B' || data3 === 'B' || data4 === 'B') {
        return 'B'
    } else {
        return 'A'
    }
}


5 个答案:

答案 0 :(得分:2)

您只能使用一个功能,而不能使用三个单独的功能。

代码步骤说明

  • 第一步:使用spread语法传递第N个参数(在此代码中为...arg),并且此arg是一个数组。
  • 步骤2:创建一个all_messages对象,并尝试使用find()arg中找到all_messages的一个键
  • 第3步::如果从消息列表中查找,请从all_messages返回该键值。
  • 第4步::如果A不包含任何值all_message,则设置默认值arg

const status = (...arg) => {
    const all_messages = {error: 'error', C: 'C', B: 'B'};
    const message = arg.find(key => !!all_messages[key])
    return message ? message : 'A'
}

console.log(status('F', 'F'))
console.log(status('C', 'A'))
console.log(status('C', 'C', 'C', 'C'))
console.log(status('error', 'error', 'error', 'error'))
console.log(status('B', 'B', 'B'))

答案 1 :(得分:0)

您可以为此编写一个函数,而不是三个。像这样:

const statusFilter = (dataArray) ...

比较数组的值。如果它们都相同,则返回值,否则返回A。

答案 2 :(得分:0)

只需将数组用作参数:

const statusFilters = data => {
  if (Array.isArray(data)) {
    if (data.includes("error")) return "error";
    else if (data.includes("C")) return "C";
    else if (data.includes("B")) return "B";
    else return "A";
  }
};

statusFilters([data1, data2, data3 ...]);

答案 3 :(得分:0)

您可以尝试这样的事情:

15:30

答案 4 :(得分:0)

最干净的方法是根据首先要返回的内容,按照优先级排序要检查的状态数组。在您的示例中,顺序似乎为error, c, b, a,然后如果找到匹配项,则可以遍历该数组并返回该状态。最后,如果没有找到匹配项,则返回默认值,在您的情况下为a

// In order of priority
const statuses = [ 'error', 'C', 'B', 'A' ]

const statusFilter = (...args) => {  
  for (let status of statuses) {
     if(args.find(v => v === status))
        return status;
  }
  return 'A'
}

console.log(statusFilter('error', 'B', 'A'))
console.log(statusFilter('C', 'B', 'A'))
console.log(statusFilter('B', 'B', 'A'))
console.log(statusFilter('A', 'A', 'A'))