JavaScript objects 有总订单吗?
Is there a total order on JavaScript objects?
标题几乎说明了一切。使用 <
、>
、<=
和 >=
运算符时,JavaScript 是否保证 objects 上的总顺序?
我写了一些代码只是为了检查某些 objects 上的总排序。结果与全序一致,但这并不能证明什么:
function thereIsTotalOrder(items){
var one, other, theThird;
// warning: n^3 complexity follows
// If a <= b and b <= a then a = b (antisymmetry);
for(var i=0; i<items.length; i++){
for(var j=0; j<items.length; j++){
one = items[i];
other = items[j];
if((one <= other) && (other <= one) && (one != other)){
return false;
}
}
}
// If a <= b and b <= c then a <= c (transitivity)
for(var i=0; i<items.length; i++){
for(var j=0; j<items.length; j++){
for(var k=0; k<items.length; k++){
one = items[i];
other = items[j];
theThird = items[k];
if((one <= other) && (other <= theThird) && !(one <= theThird)) {
return false;
}
}
}
}
// a <= b or b <= a (totality).
for(var i=0; i<items.length; i++){
for(var j=0; j<items.length; j++){
one = items[i];
other = items[j];
if(!((one <= other) || (other <= one))) {
return false;
}
}
}
return true;
}
function a(){};
function b(){};
var c = "foo";
var d = "bar";
var e = "bar";
var f = function(){};
var g = {name : "bananas"};
console.log(thereIsTotalOrder([a, b, c, d, e, f, g])); // prints "true"
取决于我们正在考虑的对象。如果我们把注意力局限于numbers, then yes, the order will be total. As your example demonstrates, the same can be said of (at least some) strings的class。但整体性似乎并不普遍。
例如,如果您将 var h = 5;
添加到您的声明中,然后将 h
添加到您的 thereIsTotalOrder
调用中,您将得到一个 false
。那是因为在 h = 5
和 c = 'foo'
的状态下,(h
≤ c
∨ c
≤ h
) 是假的(这意味着totality 不满意)。
正如您正确指出的那样,虽然 thereIsTotalOrder
返回的假值不存在并不能 证明 所有对象都是完全有序的,但存在 false
值 确实 证明所有对象之间的顺序(如果定义)不是总的。
标题几乎说明了一切。使用 <
、>
、<=
和 >=
运算符时,JavaScript 是否保证 objects 上的总顺序?
我写了一些代码只是为了检查某些 objects 上的总排序。结果与全序一致,但这并不能证明什么:
function thereIsTotalOrder(items){
var one, other, theThird;
// warning: n^3 complexity follows
// If a <= b and b <= a then a = b (antisymmetry);
for(var i=0; i<items.length; i++){
for(var j=0; j<items.length; j++){
one = items[i];
other = items[j];
if((one <= other) && (other <= one) && (one != other)){
return false;
}
}
}
// If a <= b and b <= c then a <= c (transitivity)
for(var i=0; i<items.length; i++){
for(var j=0; j<items.length; j++){
for(var k=0; k<items.length; k++){
one = items[i];
other = items[j];
theThird = items[k];
if((one <= other) && (other <= theThird) && !(one <= theThird)) {
return false;
}
}
}
}
// a <= b or b <= a (totality).
for(var i=0; i<items.length; i++){
for(var j=0; j<items.length; j++){
one = items[i];
other = items[j];
if(!((one <= other) || (other <= one))) {
return false;
}
}
}
return true;
}
function a(){};
function b(){};
var c = "foo";
var d = "bar";
var e = "bar";
var f = function(){};
var g = {name : "bananas"};
console.log(thereIsTotalOrder([a, b, c, d, e, f, g])); // prints "true"
取决于我们正在考虑的对象。如果我们把注意力局限于numbers, then yes, the order will be total. As your example demonstrates, the same can be said of (at least some) strings的class。但整体性似乎并不普遍。
例如,如果您将 var h = 5;
添加到您的声明中,然后将 h
添加到您的 thereIsTotalOrder
调用中,您将得到一个 false
。那是因为在 h = 5
和 c = 'foo'
的状态下,(h
≤ c
∨ c
≤ h
) 是假的(这意味着totality 不满意)。
正如您正确指出的那样,虽然 thereIsTotalOrder
返回的假值不存在并不能 证明 所有对象都是完全有序的,但存在 false
值 确实 证明所有对象之间的顺序(如果定义)不是总的。