Извлечение значений нескольких объектов

#javascript #arrays #unique

#javascript #массивы #уникальный

Вопрос:

У меня есть такой объект:

 object["key1"] = "text1"
object["key2"] = "text2"
object["key3"] = "text1"
object["key4"] = "text3"
  

Как я могу выдавать (например, оповещать) элементы с одинаковыми значениями (text1, text2 и так далее)?

В приведенном выше примере это должно быть object["key1"] и object["key2"] .

Спасибо

Комментарии:

1. Гм … перебирать массив и проверять каждое значение?

2. Это не массив, это объект. Массивы в JavaScript имеют только числовые ключи.

3. Я полагаю, вы имеете в виду object['key1'] и object['key3'] ?

Ответ №1:

Вы можете «инвертировать» свой объект (свойства становятся значениями, значения становятся свойствами):

 var byValue = {};

for (var prop in object) {
    if (!(object[prop] in byValue)) {
        byValue[object[prop]] = [];
    }
    byValue[object[prop]].push(prop);
}
  

Это должно привести к такой структуре:

 {
    'text1': ['key1', 'key3'],
    'text2': ['key2'],
    'text3': ['key4']
}
  

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

 for (var value in byValue) {
    if (byValue[value].length > 1) {
        alert(byValue[value].join(', '));
    }
}
  

Ответ №2:

Я отсортировал массив, а затем подумал, что вы захотите предупреждать или выполнять какие-либо функции только один раз для каждого повторяющегося элемента. ПРЕДУПРЕЖДЕНИЕ: сортировка может усложняться из-за размера массива http://jsfiddle.net/SPQJ7 / Вышеупомянутая скрипка уже настроена и работает с несколькими повторными элементами

Ответ №3:

Я обновил свой скрипт

http://jsfiddle.net/HerrSerker/LAnRt/

Это не проверяет идентичность в комплексных значениях, только для равенства (см. Пример foo)