2015-04-08 3 views
-3

Как добавить только уникальное значение в массив JavaScript?Как добавить только уникальное значение в массив JavaScript?

Здесь определяется массив i, ниже код добавляет дублирующее значение в массив, но я не хочу добавлять повторяющиеся значения, если он уже существует в ary , любая помощь?

var ary = []; 
function setFavorite(name, value){ 
    var obj = {}; 
    obj[name] = value; 

    ary.push(obj); 
    .... 
    .... 

FIDDLE HERE

+0

ES6/ES2015 будет включать в себя класс 'Set', который обеспечивает набор. То, что вы описываете, скорее похоже на «карту». – Pointy

+0

Также это не имеет особого отношения к jQuery. – Pointy

+0

Обновленный вопрос @Pointy, SO предложил поместить ярлык jquery .. Можем ли мы сделать то же самое в основном javascript? , можете ли вы, пожалуйста, обновить скрипку, это поможет легко понять –

ответ

5

ECMAScript 6 (который sorrily пока не доступен) будет native Sets.

Однако, так как это не то, что вы сейчас хотите, потому что никто не сможет использовать ваш сайт, попробуйте Polyfill like this one или сделать ваш код проверить массив для значения перед введением, например, с помощью этого кода (demo):

function contains (array, value) { 
    var doesContain = false 

    for (var i = 0, length = array.length; i < length; i++) { 
    if (array[i] === value) { 
     doesContain = true 
     break 
    } 
    } 

    return doesContain 
} 

EDIT: не читал код, только описание.

Так что на самом деле то, что вы хотите, это Map/a Object. Перед установкой свойства этого объекта, проверьте, если он уже существует:

if (object.hasOwnProperty(prop)) { 
    throw new Error('Hey, you have already set ' + prop + '!') 
} else { 
    obj[prop] = value 
} 

Вы можете прочитать больше о Object s here (MDN) и here (eloquent javascript book). У последнего даже есть раздел об использовании объектов в качестве карт.

+0

Просто придерживайтесь второго решения (с 'obj.hasOwnProperty'). Вещь 'contains' предназначена для использования с массивами (' [] 'нотация), но вы используете Object (' {} 'нотация). – reg4in

5

Вы можете избежать дублирования ключей в карте (которая действительно то, что вы описываете здесь), используя простой объект.

var map = {}; 

function setFavorite(name, value) { 
    map[name] = value; 
} 

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

function setFavorite(name, value) { 
    if (map[name]) { 
     throw new Error('Cannot insert duplicate value'); 
    } 
    map[name] = value; 
} 

Чтобы получить значение по ключу, доступ будет его по имя свойства, которое вы сохранили. Обратите внимание: если значение ключа является переменной, вы должны использовать обозначение массива (с помощью скобок []).

var value = map[key] 

или

var value = map.keyHappenedToBeValidIdentifier 

Повторить через карту, используйте Object.keys.

Object.keys(map).forEach(function(key) { 
    var value = map[key]; 
    // do some useful work with the value 
}); 
+0

Сорр!Не полезно, я задал вопрос, чтобы получить ответ в терминах массива NOT, использующего карту. Обновите свой ответ в отношении массива –

+0

С уважением, * no *. Массив не предназначен для хранения уникальных записей. Я не собираюсь использовать кувалду, чтобы выполнить задачу отвертки. – jdphenix

+0

вы правы, если бы я знал это раньше, я мог бы использовать карту вместо массива. Теперь, если я изменю это на карту, тогда весь код будет получен, потому что они выбирают как массив NOT map, что я должен делать в этой ситуации, любое предложение? –