我在构造函数上有一个类和一些可选的配置选项。规则是允许值的无彼此为===
。什么是雄辩的方式来确定是否有任何彼此相等。所有字符都是字符串,并且还将进行验证以确保不超过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');
}
但我觉得可能有更优雅的方式处理这个问题。
答案 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;