У меня есть довольно простой объект JavaScript, который я использую в качестве ассоциативного массива. Существует ли простая функция, позволяющая мне получить ключ для значения, или мне нужно выполнить итерацию объекта и найти его вручную?
javascript
object
ярик
источник
источник
var o = []; var map = {first: o, second: o}
, Что быfind_key(o)
вернуться?Ответы:
С библиотекой Underscore.js :
источник
_.chain(hash).pairs().findWhere({1: 1}).value()[0]
ES6, нет прототипов мутаций или внешних библиотек.
Пример,
источник
keys()
материализует набор ключей.function getKeyByValue(object, value) { return Object.keys(object).filter(key => object[key] === value); }
Стандартный метод недоступен. Вам нужно повторить, и вы можете создать простой помощник:
Одно слово предостережения : даже если вышеперечисленное работает, это вообще плохая идея расширить любой хост или нативный объект
.prototype
. Я сделал это здесь, потому что это очень хорошо подходит для этого вопроса. В любом случае, вам, вероятно, следует использовать эту функцию вне.prototype
и вместо нее передать объект.источник
.toString()
likeobj[ key ].toString()
и к значению, если это необходимо ...Как сказано, итерация необходима. Например, в современном браузере вы можете иметь:
куда
value
содержит значение, которое вы ищете. Сказал, что я, вероятно, использовал бы цикл.В противном случае вы можете использовать правильный объект "hashmap" - в JS есть несколько реализаций - или реализовать его самостоятельно.
ОБНОВЛЕНИЕ 2018
Прошло шесть лет, но я все еще получил немного голосов здесь, поэтому я чувствую, что более современное решение - для современного браузера / среды - должно быть упомянуто в самом ответе, а не только в комментариях:
Конечно, это также может быть функция:
источник
Object.keys(obj).or(o=>o[key] === value)
or
массиве метод, и мне не понятно его цель здесь: я буду признателен за некоторые дополнительные детали! :)or
точно! Это было только недавно оценено и принято (я не думаю, что кто-нибудь еще реализует это). Что он делает, так это находит первый элемент массива, соответствующий предикату, и возвращает его. Так[1,2,3,4].or(x=>x>2)
бы вернулись3
и[1,2,3,4,5].or(x=>x<3)
вернулись бы1
. Что-то вроде C #'s FirstOrDefault :)or
методе? Из того, что вы упомянули, кажется, что он возвращает элемент, который соответствует предикату "или" сам массив?or
был переименован. Я считаю, что теперь вы должны использовать найти .Лодаш путь https://lodash.com/docs#findKey
источник
_.findKey(users, { 'age': 1, 'active': true });
... это то же самое_.find_key({a: "A", b:"B"}, "B"})
возвращаетundefined
так, как указано здесь, вам нужно сделать_.find_key({a: "A", b:"B"}, _.partial(_.isEqual,"B")})
_.invert(haystack)[needle]
Сделано для закрытия компилятора, чтобы извлечь имя ключа, который будет неизвестен после компиляции
Более сексуальная версия, но использующая будущее
Object.entries
функцииисточник
Object.entries(obj).find(i => i[1] === val);
использоватьfilter
вместо этогоObject.entries(obj).filter(i => i[1] === val);
Object.entries(obj).find( ([ key, value ]) => value === val);
ES6 + один вкладыш
Вернуть все ключи со значением:
источник
Я использую эту функцию:
Применение:
источник
obj.hasOwnProperty(key)
или это не нужно в этом случае?Основная функция:
Объект с ключами и значениями:
Тестовое задание:
источник
Object.keys(greetings )[Object.values(greetings ).indexOf('привіт')]
Пример:
источник
Если вы работаете с библиотекой Underscore или Lodash , вы можете использовать функцию _.findKey :
источник
Я создал библиотеку bimap ( https://github.com/alethes/bimap ), которая реализует мощный, гибкий и эффективный интерфейс двунаправленной карты JavaScript. Он не имеет зависимостей и может использоваться как на стороне сервера (в Node.js вы можете установить его с помощью
npm install bimap
), так и в браузере (по ссылке на lib / bimap.js). ).Основные операции действительно просты:
Поиск соответствия ключ-значение одинаково быстр в обоих направлениях. Под капотом нет дорогостоящих обходов объектов / массивов, поэтому среднее время доступа остается постоянным независимо от размера данных.
источник
не увидел следующее:
источник
Поскольку значения уникальны, должна быть возможность добавить значения в качестве дополнительного набора ключей. Это можно сделать с помощью следующего ярлыка.
Это позволит получить либо ключ, либо значение:
Это предполагает, что между ключами и значениями нет общих элементов.
источник
Учитывая
input={"a":"x", "b":"y", "c":"x"}
...output={"x":"a","y":"b"}
):output={"x":"c","y":"b"}
):output={"x":["c","a"],"y":["b"]}
):источник
output['x']
. Это то, что вы спрашивали?http://jsfiddle.net/rTazZ/2/
источник
Или еще проще - создайте новый объект с ключами и значениями в нужном вам порядке, а затем посмотрите на этот объект. У нас были конфликты с использованием прототипов кодов выше. Вам не нужно использовать функцию String вокруг клавиши, это необязательно.
источник
Это небольшое расширение метода Underscorejs, и вместо него используется Lodash :
FindKey будет искать и возвращать первый ключ, который соответствует значению.
Если вы хотите использовать последнее совпадение, используйтевместо него FindLastKey .
источник
Как будто этот вопрос не был избит до полусмерти ...
Вот один только для любопытства это приносит вам ...
Если вы уверены, что ваш объект будет иметь только строковые значения, вы действительно можете исчерпать себя, чтобы вызвать в воображении эту реализацию:
Может быть, здесь есть что-то полезное ...
Надеюсь, это вас забавляет.
источник
Вот решение Lodash, которое работает для плоского ключа => объекта значения, а не для вложенного объекта. Принятый ответ предлагает использовать
_.findKey
работы для объектов с вложенными объектами, но он не работает в этом обычном случае.Этот подход инвертирует объект, меняя ключи на значения, а затем находит ключ, просматривая значение нового (инвертированного) объекта. Если ключ не найден, то
false
возвращается, что я предпочитаюundefined
, но вы можете легко поменять его в третьем параметре_.get
метода вgetKey()
.источник
Вот мое решение в первую очередь:
Например, я предполагаю, что у нас есть объект, который содержит три пары значений:
Мы можем просто написать findKey (массив, значение), который принимает два параметра, которые являются объектом и значением ключа, который вы ищете. Таким образом, этот метод можно использовать повторно, и вам не нужно каждый раз вручную повторять объект, передавая только два параметра для этой функции.
источник
ES6 методы:
источник
Я обычно рекомендую lodash, а не подчеркивание.
Если у вас есть, используйте его.
Если вы этого не сделаете, то вам следует рассмотреть возможность использования пакета lodash.invert npm, который довольно крошечный.
Вот как вы можете проверить это, используя gulp:
1) Создайте файл с именем gulpfile.js со следующим содержимым:
2) Установите пакет lodash.invert и проглотите
3) Проверьте, что это работает:
Ссылки
https://www.npmjs.com/package/lodash.invert
https://lodash.com/
Различия между lodash и подчеркиванием
https://github.com/gulpjs/gulp
источник
Подчеркни JS решение
источник
это сработало для меня, чтобы получить ключ / значение объекта.
источник
Действительно просто.
источник
Будь проще!
Вам не нужно фильтровать объект с помощью сложных методов или библиотек, Javascript имеет встроенную функцию под названием Object.values .
Пример:
Это вернет данные свойства объекта.
Ссылки
https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Object/values
источник