是否有可能以另一种方式检查所有变量是否彼此不同?
var a = 1, b = 2, c = 3, d = 4;
if(a != b && a != c && a != d && b != a && b != c && b != d && c != a && c != b && c != d && d != a && d != b && d != c){
//All numbers are different
}
例如
if(a != b != c != d){
}
您可以将它们全部存储在一个对象中,并检查键的数量是否等于所使用的变量的数量,如下所示
var dummy = {};
dummy[a] = true;
dummy[b] = true;
dummy[c] = true;
dummy[d] = true;
console.log(Object.keys(dummy).length === 4);
如果值不同,则每次都会创建一个新键,并且键的数量将等于所使用的变量的数量
正如Denys ssamguret所评论的那样,如果你有一个合适的数据结构,那么它将有可能以一种更优雅的方式完成。
然而,你仍然可以简化,因为你可以删除重复的检查。
例如,您检查a != b,然后检查b != a。这两次检查实际上是相同的,只是顺序不同。
删除所有副本将得到…
if(a != b && a != c && a != d && b != c && b != d && c != d)
这是比较简单的,虽然你仍然会更好地结构化你的数据。
另一个解决方案是push
数组中的变量:
var a = 1,
b = 2,
c = 3,
d = 4;
var arr = [];
arr.push(a);
arr.push(b);
arr.push(c);
arr.push(d);
var sorted_arr = arr.sort(); // You can define the comparing function here.
// JS by default uses a crappy string compare.
var results = [];
for (var i = 0; i < arr.length - 1; i++) {
if (sorted_arr[i + 1] == sorted_arr[i]) {
results.push(sorted_arr[i]);
}
}
alert(results);
另一种使用数组的方法
var a =10, b = 20, c=30, d =40, e =50;
alert(isVariablesDifferent(a,b,c,d,e));
function isVariablesDifferent(){
var params = Array.prototype.slice.call(arguments);
for(var i = 0; i < params.length; i++){
if(params.lastIndexOf(params[i]) !== i){
return false;
}
}
return true;
}
我为您做了一个函数来测试这个。但对于大型数据集,这可能代价高昂。
小提琴在这里:https://jsfiddle.net/Luqm8z7b/
function uniqueTest(ary){
for(var i=ary.pop(); ary.length > 0;i=ary.pop()){
for(var j = 0; j < ary.length; j++){
if(i === j) return false;
}
}
return true;
}
var a = 1, b = 2, c = 3, d = 4;
var list = [];
list.push(a, b, c, d);
console.log(uniqueTest(list));
为变量创建一个数组。从第一个元素到最后一个元素迭代整个元素,并像下面那样比较或硬编码。
var a = 1, b = 2, c = 3, d = 4;
if(a != b && a != c && a != d && b != c && b != d && c != d)
alert('all the variables are unique');
请参考我的示例代码在jsfiddle
http://jsfiddle.net/parthipans/fNPvf/15217/我认为没有上下文应该很难提供一个高质量的答案,但是自从ECMA-Script 5以来,有一个Array.prototype.every
函数来检查是否所有数组项都符合布尔表达式。也就是说,您可以这样表达同一个问题:
var a = 1, b = 2, c = 3, d = 4;
if(
[b, c, d].every(function(someVar) { return someVar != a; })
&& [a, c, d].every(function(someVar) { return someVar != b })
&& [a, b, d].every(function(someVar) { return someVar != c })
&& [a, b, c].every(function(someVar) { return someVar != d })
) {
alert("all different!");
}
或者检查如何将different(...)
函数简化为Array.prototype
(或者您可以将其实现为某些自定义对象的属性或仅作为常规过程函数…)。
Array.prototype.different = function() {
var results = [];
for(var i = 0; i < this.length; i++) {
// This is to clone the array so we don't modify the source one
var arrayCopy = [].concat(this);
// This drops the variable value to check and returns it
var varValueToCheck = arrayCopy.splice(i, 1);
// Then we use every to check that every variable value doesn't
// equal current variable value to compare
results.push(arrayCopy.every(
function(varValue) {
return varValue != varValueToCheck;
})
);
}
// Once we've got all boolean results, we call every() on
// boolean results array to check that all items are TRUE
// (i.e. no variable equals to other ones!)
return results.every(function(result) { return result; });
};
// This should avoid that other libs could re-define "different"
// function, and also it should avoid for..in or forEach issues
// finding unexpected functions, as this function will be hidden
// when iterating Array.prototype
Object.defineProperty(Array.prototype, "different", {
enumerable: false,
configurable: false,
writable: false
});
var a = 1, b = 2, c = 3, d = 4;
// Simplified check!
if([a, b, c, d].different()) {
alert("also all different!!!");
}
现在的问题可能是,如果用我的建议来简化像你这样的if
语句是矫枉过正还是矫枉过正,但这将取决于你的实际用例