Уникальные значения в хэше JavaScript - PullRequest
2 голосов
/ 23 января 2012

Мне нужно вставить хеш в массив, только если он не содержит хеш, который я хочу добавить.Например, у меня есть массив хэшей:

var someArray = [
        {field_1 : "someValue_1", field_2 : "someValue_2"},
        {field_1 : "someValue_3", field_2 : "someValue_4"},
        {field_1 : "someValue_5", field_2 : "someValue_6"}
    ]

Значение

{field_1 : "someValue_1", field_2 : "someValue_2"}

не должно быть помещено в массив, так как оно уже есть, но значение

{field_1 : "someValue_7", field_2 : "someValue_8"}

следует, так как массив не содержит такого значения.

Есть ли способ сделать это с помощью jQuery?

Теперь я просто использую цикл $ .each и проверим,массив содержит некоторый хэш.Если это так, я запускаю флаг.Но мне не нравится это решение.

Ответы [ 3 ]

2 голосов
/ 23 января 2012
  1. создать собственный прототип для проверки наличия объекта в массиве. Пожалуйста, проверьте дизайн прототипа ниже.
Array.prototype.contains=function(x){
 for(i in this){
   if((x.field_1==this[i].field_1)&&(x.field_2==this[i].field_2))
     return true;  
 }
 return false;
}
  1. Используя вышеприведенный прототип, вы можете проверить наличие объекта в массиве.
 var someArray = [
        {field_1 : "someValue_1", field_2 : "someValue_2"},
        {field_1 : "someValue_3", field_2 : "someValue_4"},
        {field_1 : "someValue_5", field_2 : "someValue_6"}
    ];

var a1={field_1 : "someValue_1", field_2 : "someValue_2"};
var a2={field_1 : "someValue_7", field_2 : "someValue_8"};

if(!someArray.contains(a1))   someArray.push(obj);  // it will NOT BE pushed
if(!someArray.contains(a2))   someArray.push(obj); // it will be pushed
1 голос
/ 23 января 2012

В качестве альтернативы, вы можете увеличить массив или определить свой прототип следующим образом:

Array.prototype.add = function(element){
    var itemExists = false;
    for(var i=0;i<this.length;i++){
        if(this[i]==element){
            itemExists = true;
            break;
        }
    }
    if(itemExists==false)
        return this.push(element);
}

Таким образом, использование [] .add (yourElement) добавит этот элемент в ваш массив, только если он этого еще не сделал.существовать.Не стесняйтесь изменять структуру аргумента и, если условие, в соответствии с вашими потребностями.

0 голосов
/ 23 января 2012

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

function IsElementInSet(Element,Set)
{
    var ElementIsInSet=false;

    for(var i=0;i<Set.length;i++)
    {
        if(Set.field_1==Element.field_1&&Set.field_2==Element.field_2)
        {
                ElementIsInSet=true;
                break;
        }
    }

    return ElementIsInSet;
}

Вот как яделать вещи.Создать функцию, которая делает некоторые проверки и дает мне истину, если элемент уже существует.

Существуют и другие возможные решения для оптимизации поиска, если вы работаете с большими массивами и чувствуете, что все работает медленно, но я сомневаюсь, что вы это сделаете.

РЕДАКТИРОВАТЬ: Кроме того, об использовании параллельной структуры для сохранения текущих значений - очень сложно иметь обычный массив (одно измерение), в котором сохраняется только одно значение - в вашем случае это будет Element.field_1+ Element.field_2 (объединить строки).Затем вы можете написать другую функцию, которая проверяет, есть ли заданное значение в этом массиве.Я думаю, что два решения одинаковы, и это вопрос стиля, а не скорости.

...