JavaScript - найти ключи, зная их значения

347
24 июня 2017, 13:47

Как сделать так, чтобы эта функция возвращала массив с ключами. Вот код этой самой функции:

Object.prototype.getKeyByValue = function(value, objs) {
    if (!objs) objs = [];
    for (var prop in this) {
        if (this.hasOwnProperty(prop)) {
            if (this[prop] === value) {
                return prop;
            } else if(typeof this[prop] === "object" && objs.indexOf(this[prop]) == -1) {
                objs.push(this[prop]);
                var res = this[prop].getKeyByValue(value, objs);
                if (res) return prop + "." + res;
            }
        }
    }
}

Эта функция хорошо работает в этом примере:

Object.prototype.getKeyByValue = function(value, objs) { 
  if (!objs) objs = []; 
  for (var prop in this) { 
    if (this.hasOwnProperty(prop)) { 
      if (this[prop] === value) { 
        return prop; 
      } else if (typeof this[prop] === "object" && objs.indexOf(this[prop]) == -1) { 
        objs.push(this[prop]); 
        var res = this[prop].getKeyByValue(value, objs); 
        if (res) return prop + "." + res; 
      } 
    } 
  } 
} 
 
var foobar = { 
  foo: 5, 
  bar: { 
    baz: 3 
  } //для теста сделаем вложеный объект 
} 
 
document.write(foobar.getKeyByValue(3));

Однако когда появляется второй ключ с таким же значением, он не находится (понятно почему). Надо сделать так, чтобы getKeyByValue возвращал массив. Так как это можно реализовать?

Answer 1

Object.prototype.getKeysByValue = function (value) { 
    let keys = []; 
    for (let key of Object.keys(this)) { 
        if (this[key] === value) { 
            keys.push(key); 
        } else if (typeof this[key] === 'object') { 
            let keysInner = this[key].getKeysByValue(value); 
            for (let keyInner of keysInner) { 
                keys.push(key + '.' + keyInner); 
            } 
        } 
    } 
    return keys; 
}; 
 
let foobar = { 
    aaa: 7, 
    bbb: 10, 
    ccc: { 
        ddd: 7, 
        eee: { 
            fff: 7, 
            ggg: 10 
        } 
    } 
}; 
 
console.log(foobar.getKeysByValue(7));

READ ALSO
“Конструктор” node js скрипта

“Конструктор” node js скрипта

Запускаю скрипт через cli, передаю в нее аргументы, каким образом я могу обработать эти аргументы до выполнения самого скрипта? При require использовал...

250
JavaScript и длинная регулярка

JavaScript и длинная регулярка

Доброго времени суток! У меня есть регулярка, предназначенная для поиска форм одного и того же слова в строкеЭти регулярки автоматически...

297
wordpress function.php не работает easing.min.js

wordpress function.php не работает easing.min.js

Скрипт 'freelancerjs' зависит от 'easingjs', при явном объявлении в футере все хорошо работает, но через правильное объявление в functionphp, 'easingjs' не срабатывает...

329