在对象

时间:2016-07-15 10:30:15

标签: javascript node.js object recursion

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

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

前:

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但是,我想要编辑属性并使用修改后的属性返回整个对象,而不仅仅是具有该属性的对象的子集。

4 个答案:

答案 0 :(得分:0)

你试过了吗?

obj1.hasOwnProperty('propIWant')

答案 1 :(得分:0)

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

&#13;
&#13;
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))
&#13;
&#13;
&#13;

答案 2 :(得分:0)

好吧,检查道具是否是自己的对象并使用递归函数来找到&#34; deep&#34;您正在寻找的房产?

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'))

演示 - &gt;的 http://jsfiddle.net/zqcurg70/

答案 3 :(得分:0)

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

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'); 可以是数字。

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

Select * from Notification
left join UserNotification on Notification.id = UserNotification.NotificationId
where UserNotification.id is null