雄辩的方法来确定任何变量是否相等

时间:2015-12-06 04:25:51

标签: typescript

我在构造函数上有一个类和一些可选的配置选项。规则是允许值的彼此为===。什么是雄辩的方式来确定是否有任何彼此相等。所有字符都是字符串,并且还将进行验证以确保不超过1个字符。

constructor(options?: ClassOptions){
    this.leftWrapperChar = options.leftWrapperChar || '{';
    this.rightWrapperChar = options.rightWrapperChar || '}';
    this.commandChar = options.commandChar || '%';
    this.variableChar = options.variableChar || '+';
    this.commentChar = options.commentChar || '#';
    this.variableAssignmentChar = options.variableAssignmentChar || ':';
    this.stringEscapeChar = options.stringEscapeChar || '\\';
    // Determine if any are equal to each other
}

显然,这可以通过a !== b && b !== c && c !== d && ...完成,但这个列表可能会增长,排列也会呈指数级。

我目前的解决方案是将所有选项放入数组并对其进行排序,然后将它们与下一个索引进行比较

const array = [
    this.leftWrapperChar, 
    this.rightWrapperChar, 
    this.commandChar, 
    this.variableChar, 
    this.commentChar, 
    this.variableAssignmentChar, 
    this.stringEscapeChar].sort();
for(let i=0; i< array.length - 1; i++){
    if(array[i] === array[i + 1]) 
        throw new Error('Options Error: All Options chars must be unique');
}

但我觉得可能有更优雅的方式处理这个问题。

1 个答案:

答案 0 :(得分:1)

更优雅的方式?我不相信。 更好的方法?不要使用Array#sort。请改用简单的循环。它会更干净,性能更好。

function anyEqual(...args: any[]): boolean {
  const found = [];
  return Array.prototype.some.call(args, arg => {
    if (found.indexOf(arg) > -1) return true;
    found.push(arg);
  });
}

像这样使用:

if (anyEqual(...Object.keys(options).map(key => options[key]))) throw new Error;