JavaScript查找对象属性

时间:2018-11-16 07:18:20

标签: javascript

我想在对象内找到我想要的属性。
有一个物体。

let obj = {
  1: {
    2 : {
      3: {
        4: {
          5: {

          }
        }
      },
      100: {

      }
    }
  },
  6: {
    7: {
      8: {
      }
    },
    14:{

    }
  },
  11: {
    12: {

    },
    13:{

    }
  }
}
console.log(obj.hasOwnProperty(1)); // true
console.log(obj.hasOwnProperty(6)); // true
console.log(obj.hasOwnProperty(2)); // false
console.log(obj.hasOwnProperty(3)); // false

当我用2(其他)搜索时,我想获得真实的结果。

我该怎么办?

4 个答案:

答案 0 :(得分:4)

您将需要一个递归函数。一种选择是测试some中的entries是否具有您要查找的属性,或者条目的值是否是对象,并且该对象通过递归测试:

let obj={1:{2:{3:{4:{5:{}}},100:{}}},6:{7:{8:{}},14:{}},11:{12:{},13:{}}}

function hasNestedProp(obj, findProp) {
  findProp = String(findProp);
  return Object.entries(obj).some(([key, val]) => {
    return (
      key === findProp
      || typeof val === 'object' && hasNestedProp(val, findProp)
    );
  });
}

console.log(hasNestedProp(obj, 1));
console.log(hasNestedProp(obj, 6));
console.log(hasNestedProp(obj, 2));
console.log(hasNestedProp(obj, 3));
console.log(hasNestedProp(obj, 555));

或更简洁地说,如果您改为传入字符串值(毕竟属性始终为 strings ):

let obj={1:{2:{3:{4:{5:{}}},100:{}}},6:{7:{8:{}},14:{}},11:{12:{},13:{}}}

const hasNestedProp = (obj, findProp) => (
  Object.entries(obj).some(([key, val]) => (
    key === findProp
    || typeof val === 'object' && hasNestedProp(val, findProp)
  ))
)

console.log(hasNestedProp(obj, '1'));
console.log(hasNestedProp(obj, '6'));
console.log(hasNestedProp(obj, '2'));
console.log(hasNestedProp(obj, '3'));
console.log(hasNestedProp(obj, '555'));

答案 1 :(得分:1)

对于嵌套对象,还需要检查每个子对象。尝试关注

let obj={1:{2:{3:{4:{5:{}}},100:{}}},6:{7:{8:{}},14:{}},11:{12:{},13:{}}}

function hasKey(o, key) {
  for(let k in o) {
    if(k == key) return true;
    else if(typeof o[k] === "object" && hasKey(o[k], key)) return true;
  }
  return false;
}

console.log(hasKey(obj, 1)); // true
console.log(hasKey(obj, 6)); // true
console.log(hasKey(obj, 2)); // true
console.log(hasKey(obj, 3)); // true

答案 2 :(得分:1)

您可以考虑选择loadash _.get。以下是他们的示例:

Server=mssql;Database=student;User Id=sa;Password=!Abcd123;

答案 3 :(得分:1)

您可以将Object.keys()Array.prototype.reduce()组合使用

代码:

const obj = {1:{2:{3:{4:{5:{}}},100:{}}},6:{7:{8:{}},14:{}},11:{12:{},13:{}}};
const hasKey = (obj, key) => Object
  .keys(obj)
  .reduce((a, c) => {
    if (c == key || typeof obj[c] === 'object' && hasKey(obj[c], key)) {
      a = true;
    }
    return a;
  }, false);

console.log(hasKey(obj, 1));
console.log(hasKey(obj, 6));
console.log(hasKey(obj, 2));
console.log(hasKey(obj, 3));
console.log(hasKey(obj, 555));