是否可以用另一种方式检查所有变量是否彼此不同?
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){
}
答案 0 :(得分:4)
您可以将它们全部存储在一个对象中,并检查键的数量是否等于所使用的变量数,如下所示
var dummy = {};
dummy[a] = true;
dummy[b] = true;
dummy[c] = true;
dummy[d] = true;
console.log(Object.keys(dummy).length === 4);
如果值不同,则每次都会创建一个新密钥,密钥数将等于所使用的变量数。
答案 1 :(得分:2)
正如DenysSéguret评论的那样,如果您的数据具有适当的结构,那么就可以以更优雅的方式进行。
但是,您可以使用所拥有的内容进行简化,因为您可以删除重复的检查。
例如,你检查一个!= b,然后检查b!= a。这两个检查实际上是相同的,只是顺序不同。
删除所有重复项会为您提供......
if(a != b && a != c && a != d && b != c && b != d && c != d)
虽然您仍然可以更好地构建数据,但这有点简单。
答案 2 :(得分:1)
使用数组的另一种方法
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;
}
答案 3 :(得分:0)
创建变量数组。迭代整个从第一个到最后一个元素并比较或硬编码,如下所示。
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中引用我的示例代码
答案 4 :(得分:0)
另一个解决方案是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);
&#13;
答案 5 :(得分:0)
我相信没有上下文应该很难提供高质量的答案,但是因为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
语句我的提议是否有点过分,但这取决于你的实际用例。
答案 6 :(得分:0)
我为你做了一个测试这个的功能。但是,对于大型数据集,这可能会很昂贵。
这是小提琴: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));