【问题标题】:javascript - find nested object key by its valuejavascript - 按值查找嵌套对象键
【发布时间】:2019-03-02 18:17:19
【问题描述】:

我正在尝试查找包含我的值的对象的键。

有我的对象:

var obj = {}

obj["post1"] = {
    "title":    "title1",
    "subtitle": "subtitle1"
}

obj["post2"] = {
    "title":    "title2",
    "subtitle": "subtitle2"
}

现在,我正在尝试获取值为“title2”的对象键

function obk (obj, val) {
  const key = Object.keys(obj).find(key => obj[key] === val);
  return key
}

console.log(obk(obj, "title2"))

输出:

undefined

期望的输出:

post2

【问题讨论】:

  • obj[key].title === val

标签: javascript object key


【解决方案1】:

你必须访问对象的子键:

 function obk (obj, prop, val) {
   return Object.keys(obj).find(key => obj[key][prop] === val);
 }

 console.log(obk(obj, "title", "title2"));

或者您可以搜索子对象的所有值:

 function obk (obj, val) {
   return Object.keys(obj).find(key => Object.values( obj[key] ).includes(val)); 
 }

 console.log(obk(obj, "title2"))

【讨论】:

    【解决方案2】:

    你可以使用数组映射:

    var obj = {}
    
    obj["post1"] = {
        "title":    "title1",
        "subtitle": "subtitle1"
    }
    
    obj["post2"] = {
        "title":    "title2",
        "subtitle": "subtitle2"
    }
    //console.log(obj);
    function obk (obj, val) {
        var result = "";
        Object.keys(obj).map(key => {
            if(obj[key].title === val)
                result = key;
        });
        return result;
    }
    
    console.log(obk(obj, "title2"));

    或者使用数组查找来优化搜索功能:

    var obj = {}
    
    obj["post1"] = {
        "title":    "title1",
        "subtitle": "subtitle1"
    }
    
    obj["post2"] = {
        "title":    "title2",
        "subtitle": "subtitle2"
    }
    //console.log(obj);
    function obk (obj, val) {
        result = Object.keys(obj).find(key => {
            if(obj[key].title === val)
                return key;
        });
        return result;
    }
    
    console.log(obk(obj, "title1"));

    【讨论】:

      【解决方案3】:

      您几乎拥有它,只需添加 obj[key].title === val,正如 Chris G 所述。

      这是一个 ES6 one liner,它返回一个包含所有匹配项的数组。

      var obj = {}
      
      obj["post1"] = {
          "title":    "title1",
          "subtitle": "subtitle1"
      }
      
      obj["post2"] = {
          "title":    "title2",
          "subtitle": "subtitle2"
      }
      
      const filterByTitle = (obj, title) => 
        Object.values(obj).filter(o => o.title === title);
      
      console.log(filterByTitle(obj, 'title1'))

      【讨论】:

        猜你喜欢
        • 2018-01-02
        • 2021-10-04
        • 2018-01-30
        • 1970-01-01
        • 1970-01-01
        • 2021-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多