2016-01-29 2 views
-2

У меня есть объект, как:Получения ключей от объекта, который имеет то же значение

Object {v: 1, b: 1, n: 1, m: 1, c: 2, d: 3} 

Я пытаюсь собрать ключи, имеет то же значение и генерировать массив (поэтому в данном случае [v, b, n, m]

. Так что, если я знаю 1, как я могу получить v,b,n,m в массиве?

+0

Любые попытки? Loop over object, сравните значение с 1, если 'true', добавьте ключ в массив. – Tushar

+0

На самом деле, я хотел знать, было ли что-нибудь еще быстрее, чем для цикла. Может быть, метод или что-то – senty

+0

@senty Хорошо, все же вам нужно показать попытки. Добавьте код, о котором идет речь. – Tushar

ответ

1

Вы можете использовать Object.keys(), чтобы получить ключевые ценности объекта, а затем отфильтровать значения на основе вашего кондициона ции с использованием filter()

var obj = { 
 
    v: 1, 
 
    b: 1, 
 
    n: 1, 
 
    m: 1, 
 
    c: 2, 
 
    d: 3 
 
    }, 
 
    val = 1; 
 

 
var res = Object.keys(obj).filter(function(v) { 
 
    return obj[v] == val; 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(res, null, 4) + '</pre>');

+1

' Object.keys' возвращает свойства, принадлежащие объекту. Эта проверка избыточна. – Oka

+0

Я не понял, что вы имеете в виду с hasOwnProperty. Просто для обучения, можете ли вы показать это в примере? очень полезно для меня и для других по этой теме .. – senty

+0

@ senty-не требуется, за комментарий Оки, поэтому 'Object.keys (obj) .filter (function (v) {return obj [v] == val;}) '. – RobG

1

производительности? Простой for...in петля.

var myObj = {v: 1, b: 1, n: 1, m: 1, c: 2, d: 3}; 
 

 
function collect (obj, value) { 
 
    var arr = []; 
 
    
 
    for (var key in obj) 
 
    if (obj.hasOwnProperty(key) && obj[key] === value) 
 
     arr.push(key); 
 
    
 
    return arr; 
 
} 
 

 
console.log(collect(myObj, 1));

Fancy? Object.keys и Array.prototype.filter.

var myObj = {v: 1, b: 1, n: 1, m: 1, c: 2, d: 3}; 
 

 
function collect (obj, value) { 
 
    return Object.keys(obj).filter(key => obj[key] === value); 
 
} 
 

 
console.log(collect(myObj, 1));

0

с помощью underscore.js библиотеки можно сделать следующие

var object = {v: 1, b: 1, n: 1, m: 1, c: 2, d: 3}; 

var output = _.map(object, function(value, key){ 
    if(value == 1){ 
     return key 
    } 
}).filter(function(value){ 
    return value; 
}); 

console.log(output); 
+0

Это больше кода, чем простой JS, что там рекомендовать? – RobG

+0

@RobG, если вы используете es6 и тернарный оператор, он близок к тому же: var output = _.map (object, (val, key) => val == 1? Key: false) .filter ((val) => вал); – jclyons52

+0

, но да, в этом случае лучше просто использовать простой js. В подчеркивании много утилит, поэтому я склонен иметь его в большинстве проектов, и возможность использовать карту на объектах, а также массивы, на мой взгляд, делает ее лучше, чем простая js-карта. – jclyons52

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