【问题标题】:Find specific property inside an object查找对象内部的特定属性
【发布时间】:2016-11-18 12:45:35
【问题描述】:

我有一个对象。我想检查其中是否存在特定属性。

问题是:我正在寻找的属性,可以在任何地方,即:对象的结构是不安全的。

例如:

obj1 = { "propIWant": "xyz" }
obj2 = { "prop1": [ {"key": "value"}, {"key":"value"}, 1, {"key": { "propIWant": "xyz"}}]

我尝试了以下方法,但似乎失败了:

var lastTry = function(entry){
  // if entry is an array
  if(typeof entry === 'object' && entry instanceof Array){
    for(var i in entry)
      entry[i] = this.lastTry(entry[i]);
  }
  // if entry is a normal object
  else if(typeof entry === 'object'){
    // iterate through the properties of the entry
    for(var key in entry){
      console.log('key is: ', entry[key])
      // in case the entry itself is an array
      if(typeof entry[key] === 'object' && entry[key] instanceof Array){
        for(var i in entry[key]){
          entry[key][i] = this.lastTry(entry[key][i]);
        }
      }
      // in case the entry is a simple object
      else if(typeof entry[key] === 'object') {
        console.log('entry[key] is an object', entry[key], key)
        // if we directely find the property.. modify it
        if(entry[key].hasOwnProperty('_internal_url')){
          **entry[key]['_internal_url'] = "http://localhost:4000"+entry[key]['_internal_url'];** <-- My objective
        }
        else{
          // call this method again on that part
          // for(var i in entry[key]){
          //   if(typeof entry[key][i] === 'object')
          //     entry[key][i] = this.lastTry(entry[key][i]);
          // }
        }
      }else{
        console.log('not found')
      }
    }
  }
}

有人可以帮我解决吗?我找到了以下内容:Find by key deep in a nested object 但是,我不想返回找到的部分,而是想编辑属性并返回具有修改后属性的整个对象,而不仅仅是具有该属性的对象。

【问题讨论】:

标签: javascript node.js object recursion


【解决方案1】:

你试过了吗:

obj1.hasOwnProperty('propIWant')

【讨论】:

    【解决方案2】:

    如果您只想检查属性是否存在,您可以将对象字符串化,然后检查字符串中是否存在值。

    var obj2 = {
      "prop1": [{
          "key": "value"
        }, {
          "key": "value"
        },
        1, {
          "key": {
            "propIWant": "xyz"
          }
        }
      ]
    }
    
    var key = 'propIWant';
    var key2 = 'propIWant1';
    
    function isPropInObject(obj, prop) {
      var r = new RegExp(prop + "\":")
      var match = JSON.stringify(obj).match(r);
      return match && match.length > 0 ? true : false
    }
    
    console.log(isPropInObject(obj2, key))
    console.log(isPropInObject(obj2, key2))

    【讨论】:

    • 上面可能会产生一个问题:如果对象是 HTML 元素输出集合的值(比如说,文本字段的内容与我正在寻找的内容相匹配,因此我可能会结束也可以操纵它)。好主意,但在这种情况下,它可能无法按预期工作
    • 经过深思熟虑,我应用了对数据进行字符串化和搜索。对象属性深度搜索返回具有该属性的对象,即我无法更改我正在寻找的对象的属性。感谢您的帮助:)
    • @RamanathanIyer 我已经在我的回答中提到过,如果你只是想检查一下。如果你想更新,你可以结合循环和我的算法。这将有助于避免不必要地检查树中的无效分支
    【解决方案3】:

    数组和对象数据可以用一种通用的方式访问:

    obj[key] and arr[pos];

    这样您可以简化代码。请注意key对于对象可以是字符串,对于数组可以是数字。

    下面的版本仅在深度优先逻辑中搜索元素和最终的子元素(数组和对象)。

    var found = 0;
    var findProp = function(entry) {
    
      if(typeof entry === 'object')
    
        for(var key in entry) {
    
          findProp(entry[key]);
    
          if( entry[key].hasOwnProperty('_internal_url')) {
            found++;
            entry[key]['_internal_url'] = "http://localhost:4000" + entry[key]['_internal_url'];
          }
        }
    }
    
    console.log('found ' + found + 'occurrences');
    

    【讨论】:

      【解决方案4】:

      那么,检查 props 本身是否是对象并使用递归函数来找到您正在寻找的“深度”属性?

      function findProp(obj, lookFor) {
        for (var prop in obj) {
          if (prop == lookFor) return obj[prop]
          if (typeof obj[prop] == 'object') {
            var checkNested = findProp(obj[prop], lookFor)    
            if (checkNested) return checkNested
          }
        }
        return false
      }
      

      它适用于console.log(findProp(obj2, 'propIWant'))

      演示 -> http://jsfiddle.net/zqcurg70/

      【讨论】:

      • 谢谢!是否可以操纵属性并返回整个对象?它不断返回搜索到的值。我的想法是改变它的属性。再次感谢:)
      • @RamanathanIyer,如果我明白你的意思,那么你可以返回一个像这个更新的小提琴这样的对象 -> jsfiddle.net/2cab85L3
      • @davidkonrad 只是一个小指针,而不是默认值return false,不返回任何内容或return undefinedfalse 可以是有效值。
      • @Rejesh,这是一个好点!它真的应该什么也不返回或未定义。如果对象添加没问题,我会更正它并且改进答案是有意义的。
      猜你喜欢
      • 1970-01-01
      • 2016-04-03
      • 2016-07-26
      • 2020-07-24
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      相关资源
      最近更新 更多