2012-01-23 3 views
2

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

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 и проверяю, содержит ли массив некоторый хэш. Если это так, я вызываю флаг. Но мне это не нравится.

+0

Итак, вы хотите реализовать составной уникальный индекс - я второй Феликс, что вы пробовали? Вам нужно будет выполнять поиск массива при каждом добавлении. Являются ли данные в 'someArray' отсортированы? (упростит поиск) – Rudu

+0

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

+0

@ Roman Другим простым вариантом является сохранение параллельного хэша с составным ключом. –

ответ

2
  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 
+0

Не могли бы вы переформатировать свои блоки кода? Увидев, что вы отредактировали его с помощью блоков кода, спасибо :) –

+0

Проверка существования перед тем, как вставить массив в массив или добавить объект в массив, если он не содержит объект. Оба служат той же цели :) –

+0

+1 Я согласен, мой пост только что пришел после твоего. Когда я нажал кнопку submit, я увидел уведомление «нового ответа». –

0

Я сталкивался с этой проблемой много раз, и то, что я всегда делаю, это написать функцию, которая возвращает значение 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; 
} 

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

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

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

1

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

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) будет только добавить, что элемент ваш массив, если он еще не существует. Не стесняйтесь изменять структуру аргумента и если условие соответствует вашим потребностям.

Смежные вопросы