2013-09-09 3 views
14

Есть ли стандартный способ сделать это? Я знаю, как в Python, но в Javascript, лучший способ добавить ключ к словарю, сначала проверив, существует ли ключ, если нет, добавьте его со значением 1, если он существует, а затем просто увеличивайте текущий счетчик.Элемент приращения объекта Javascript, если он не существует

Что-то вроде этого псевдокода:

var dict = {}; 
var new_item = "Bill" 

If new_item not in dict: 
dict[new_item] = 1 

else: 

dict[new_item] += 1 
+2

Может быть, это? '1 + (dict ['item_key'] || 0)' – mshsayem

+0

'if ('item' in dict)' сообщит вам, существует ли он. Посмотрите оператор 'in'. – elclanrs

+0

ссылка на 'in' здесь объясняется - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in –

ответ

71

Как насчет этого?

dict[key] = (dict[key] || 0) + 1; 
+0

Отлично!Один меньше поиска по сравнению с 'dict [key] = dict [key]? dict [key] +1: 1' – JoeRocc

+0

Красивые и простые. – MiniGunnR

4

Ваш псевдо-код практически идентичен реальному коду:

if (key in object) { 
    object[key]++; 
} else { 
    object[key] = 1; 
} 

Хотя я обычно пишу:

if (!(key in object)) { 
    object[key] = 0; 
} 

object[key]++; 
3

Вы можете использовать тройной оператор (:), как это? :

dictionary[key] ? 
    dictionary[key].value += 1 : 
    dictionary[key] = {value: 1}; 
0

Вы можете сделать это в большом количестве пути. В общем, если вы хотите знать, имеет ли ключ Object ключ, вы используете модификатор in с именем ключа. Это выглядит следующим образом:

var key = "key name"; 
var dict = {}; 
var hasKey = (key in dict); 

Хотя вы можете проверить, если значение устанавливается просто проверка, если это undefined. Это то, что в JavaScript, если у вас нет инициализированного значения и отправить его через оператор if, он будет действовать как ложный. Которая выглядит так:

var dict = {}; 
if(dict["key"]) { 
    print("key: " + dict[key]); 
} else { 
    print("Missing key"); 
} 
1

На большее усилие не повредит.

Вы должны проверить, есть ли у объекта собственная собственность с именем new_item. Если это не так, добавьте его и установите значение 1. В противном случае увеличиваем значение:

var dict = {}; 
var new_item = "Bill" 

dict[new_item] = dict.hasOwnProperty(new_item)? ++dict[new_item] : 1; 

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

if (!dict.hasOwnProperty(new_item)) { 
    dict[new_item] = 0; 
} 
++dict[new_item]; 
8

@ путь Snak является довольно чистым и оператор || делает это очевидным с точки зрения читабельности, так что это хорошо.

Для полноты и мелочи есть это побитовый способ это довольно пятно тоже:

dict[key] = ~~dict[key] + 1; 

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

~~(null) 
0 
~~(undefined) 
0 
~~(7) 
7 
~~({}) 
0 
~~("15") 
15 
+0

Просто хотел опубликовать этот файл, но он уже был здесь + 1 :) – Lain