有没有办法检查javascript中的几个变量是否都相等?

时间:2011-07-28 20:03:07

标签: javascript jquery variables

我有jQuery,所以如果它有用,那就可以了。

首先是一个简单的问题:

有没有办法检查几个变量是否都相等?

我可以使用传递关系逻辑并执行

if ((a == b) && (b == c)) && (c == d)) ... {

避免检查每个变量与其他变量,但我认为应该有更好的方法来做到这一点。

如果您只能回答第一部分,我们将不胜感激。

现在,棘手的部分...... 我有一个可变数量的变量(1到5之间) 我知道它们的值可以是来自DDBB的200个可能值中的任何一个。

知道这些变量中每个值的实例数量的最佳方法是什么?

例如......

如果我有......

var1 = VALUE_A;
var2 = VALUE_A;
var3 = VALUE_B;
var4 = VALUE_Z;
var5 = VALUE_Z;

...我希望得到类似的东西:

result["VALUE_A"] => 2
result["VALUE_B"] => 1
result["VALUE_Z"] => 2

/////////////////////////// 如果我有......或者

var1 = VALUE_A;
var2 = VALUE_C;
var3 = VALUE_B;

...得到:

result["VALUE_A"] => 1
result["VALUE_C"] => 1
result["VALUE_B"] => 1

/////////////////////////// 如果我有......或者

var1 = VALUE_A;
var2 = VALUE_A;
var3 = VALUE_A;
var4 = VALUE_C;
var5 = VALUE_C;

...得到:

result["VALUE_A"] => 3
result["VALUE_C"] => 2

/////////////////////////// 如果我有......或者

var1 = VALUE_A;
var2 = VALUE_A;
var3 = VALUE_A;

...得到:

result["VALUE_A"] => 3

希望我很清楚。例子是我能想到解释清楚的唯一方法。 如果这对于Javascript或处理来说过于复杂,那么很多可能的值可能会使浏览器变慢,我可以在PHP中完成并通过AJAX获得结果,但我宁愿不这样做。

5 个答案:

答案 0 :(得分:3)

会这样吗?

function countOccurrences(arr) {
    var result = {};
    $.each(arr, function(index, value) {
        if (!result[value])
            result[value] = 1;
        else
            result[value]++;
    });
    return result;
}

此函数接受值的数组,并返回一个对象,其键是元素,值是每个对象的出现次数。

答案 1 :(得分:0)

对于你的第一个问题,我认为没有任何特殊方法可以做到这一点。

对于第二个:我建议将这些变量存储在一个数组中。所以你的代码变成了:

var myVars = [];

myVars[0] = VALUE_A;
myVars[1] = VALUE_A;
myVars[2] = VALUE_B;
myVars[3] = VALUE_Z;
myVars[4] = VALUE_Z;

然后,您只需循环遍历数组并计算每个值的出现次数。

答案 2 :(得分:0)

我认为你需要创建自己的对象。该对象基本上是键/值对数组的包装器。那么你需要几个.isTrue()或其他方法。

你说你想要更高档的东西......

那么为什么不向Array对象添加你自己的方法和属性来完成工作....希望它足够清楚。

  KeyValuePair.prototype.value = null;
    KeyValuePair.prototype.key = null;



    function KeyValuePair(key, value) {
        this.key = key;
        this.value = value;
        this.Equals = Equals;

        function Equals(o) {

            if (this.value == o.value)
                return true;
            else
                return false;
        }
    }





        Array.prototype.ValuesAreEqual = ValuesAreEqual;
        Array.prototype.GetValues = GetValues;


        function ValuesAreEqual() {
            this.sort();
            for (var i = 0; i <= this.length - 1; i++) {
                var last = this.pop();
                var first = this.shift();
                if (first) {
                    return first.Equals(last);
                }
            }
        }





        function GetValues(value) {
            var arr = new Array();

            if (this.length > 0) {

                for (var i = 0; i <= this.length - 1; i++) {
                    if (this[i].value) {
                    if (this[i].value == value) {
                            arr.push(this[i].value);
                            }
                    }
                }
            }           
            return arr;
        }

    //code below would demonstrate the functionality of the above.
    var x = new Array();

    x.push(new KeyValuePair("A","Hello"));
    x.push(new KeyValuePair("B","Hello"));
    x.push(new KeyValuePair("C","Hello"));

    var y =  x.GetValues("Hello");

    document.writeln(y.length);
    document.writeln('\r\n');
    document.writeln(x.ValuesAreEqual());

答案 3 :(得分:0)

回答第一个问题。

如果要比较很多变量,这个功能可能会有所帮助。

function allEq(arr)
{
    var next;
    var curr = arr.pop();
    while (arr.length)
    {
        next = arr.pop();
        if (curr != next)
            return false;

        curr = next;
    }
    return true;
}

var a = 1, b = 1, c = 1, d = 1;
var myArr = [a, b, c, d];

if (allEq(myArr)) ... {

答案 4 :(得分:0)

简短的回答是否定的,这是不可能的。 JavaScript允许无法从环境中提取的局部变量定义。

长期答案更加细致入微。声明没有var的变量或在窗口上声明正确的变量通常是可访问的,但这样做很令人头疼。并且您通常可以通过eval获取变量的值,但仍然无法访问变量的名称(这是您需要的所有内容)。

如果您有一系列已知值,那么您可以遍历变量:

var tests = [
    VALUE_A,
    VALUE_B,
    VALUE_A,
    VALUE_C
]

function areAllEqual( arr )
{
   for( var i = 0; i < arr.length - 1; i++ )
   {
      if( arr[ i ] != arr[ i + 1 ] ) return false;
   }
   return true;
}
console.log( areAllEqual( tests ) ) // false;
console.log( areAllEqual( [1,1,1] ) ) // true;

function getOccurances(arr) {
   var result = {};
   for( var i = 0; i < arr.length; i++ )
   {
      if( isNaN( result[ arr[ i ] ] ) ) result[ arr[ i ] ] = 1;
      else result[ arr[ i ] ]++;
   }
    return result;
}
// this is not guaranteed to be in any order.
console.log( getOccurances( tests ) ) // {VALUE_A:2, VALUE_B:1, VALUE_C:1};