Есть ли способ проверить, все ли несколько переменных равны друг другу в JavaScript? - PullRequest
0 голосов
/ 29 июля 2011

У меня включен jQuery, поэтому, если он помогает использовать его, он доступен.

Первый простой вопрос:

Есть ли способ проверить, равны ли несколько переменных друг другу?

Я могу использовать транзитивную логику отношений и сделать

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

чтобы не проверять каждую переменную против КАЖДОЙ другой, но я думаю, что должен быть более изящный способ сделать это.

Если вы можете ответить только на эту первую часть, это будет очень ценно.

Теперь сложная часть ... У меня есть переменное количество переменных (от 1 до 5) Я знаю, что их значение может быть любым из 200 возможных значений из DDBB.

Как лучше всего узнать, сколько экземпляров каждого значения у меня есть в этих переменных?

Например ...

Если у меня есть ...

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 или обработки так много возможных значений до 5 раз, это может сделать браузер медленным, я могу сделать это на PHP и получить результат через AJAX, но я бы предпочел не делать.

Ответы [ 5 ]

3 голосов
/ 29 июля 2011

Будет ли что-то подобное делать?

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

Эта функция принимает массив значений и возвращает объект, ключами которого являются элементы, а значениями являются число вхожденийкаждый.

0 голосов
/ 29 июля 2011

Короткий ответ - нет, это невозможно. 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};
0 голосов
/ 29 июля 2011

Ответ на первый вопрос.

Эта функция может помочь, если есть много переменных для сравнения.

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)) ... {
0 голосов
/ 29 июля 2011

Я думаю, вам нужно создать свой собственный объект.Объект в основном является оберткой вокруг массива пар ключ / значение.Затем вам понадобится пара методов для .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());
0 голосов
/ 29 июля 2011

Для вашего первого вопроса я не думаю, что есть какой-то особый способ сделать это.

Для второго: я бы предложил хранить эти переменные в массиве.Таким образом, ваш код становится:

var myVars = [];

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

Тогда вы можете просто циклически проходить по массиву и подсчитывать вхождения каждого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...