как я могу получить ключ по значению?

#javascript #json

#javascript #json

Вопрос:

как я могу получить ключ по значению?

это мой код.

 function getkey(obj, key) {
  for (i = 0; i < obj.length; i  ) {
    if (obj[i] === key) {
      return obj[i];
    }
  }
}
var json = {
  test: {
    "key1": {
      "inkey1": "value1",
      "inkey2": "value2"
    },
    "key2": {
      "inkey3": "value3",
      "inkey4": "value4"
    }
  }
}
console.log(getkey(json, "value2"));  

я хочу получить ключ1 по значению2
как я могу получить ключ1?

пожалуйста, помогите мне!

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

1. Каков ваш ожидаемый результат?

2. Я имею в виду то, что вы хотите в качестве вывода?

Ответ №1:

Есть много способов сделать это, один из способов — использовать вариацию вашей функции и применить рекурсию. Смотрите фрагмент кода ниже:

 function getkey(obj, key) {
  for (i = 0; i < Object.keys(obj).length; i  ) {
    if (Object.values(obj)[i] === key) {
      return Object.keys(obj)[i];
    }
    if (Object.values(obj)[i].constructor == Object) {
      return getkey(Object.values(obj)[i], key)
    }
  }
}
var json = {
  test: {
    "key1": {
      "inkey1": "value1",
      "inkey2": "value2"
    },
    "key2": {
      "inkey3": "value3",
      "inkey4": "value4"
    }
  }
}
console.log(getkey(json, "value2"));  

Приводит к inkey2 . Это должно работать независимо от того, насколько глубоко вложен ключ в ваш объект.

Ответ №2:

Для не вложенной версии

 function getKeyByValue(obj, value) {
  for (let key in obj) {
     for (let inkey in obj[key]) {
       if (obj[key][inkey] === value) {
         return key;
       }
     }
  }
}

console.log(getKeyByValue(json['test'], "value2")); //key1
  

Для вложенной версии, в которой вы не знаете, насколько глубок ваш объект

 function getKeyByValue(obj, value, path) {
  path = path ? path   '.' : '';
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      if (obj[key] === value) {
        return path   key;
      } else if (typeof obj[key] === 'object') {
        let found = getKeyByValue(obj[key], value, path   key);
        if (found) {
            return found;
        }
      }
    }
  }
}

console.log(getKeyByValue(json, "value2")); //"test.key1.inkey2"
  

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

1. @DaemonWarrior Если вы укажете console.log(getKeyByValue(json[‘test’], «value2»)); он вернет ключ1

2. могу ли я также получить значение1 по ключу1?

3. @DaemonWarrior да, вы можете