0

我有一个看起来像这样的嵌套对象:

let obj = {
_id:{}
person:{
    $search:{fname:true}
    _id:{},
    fname:{}
},
code:{},
vnvEmpName:{}

}

我必须在其中搜索$search关键字并获取其中的键,在这种情况下是fname,它也可以包含多个键,我必须检索所有键。

我试过这样的事情:

function findById(obj, id) {                             

var result;
for (var p in obj) {
    if (obj.id === id) {
        return obj;
    } else {
        if (typeof obj[p] === 'object') {
            result = findById(obj[p], id);
            if (result) {
                return result;
            }
        }
    }
}
return result;

}

如果对象是这样的:

let obj = {
_id: {},
person: {
    $search: {
        lname: true
    },
    _id: {},
    fname: {},
    something:{
        $search: {
            fname: true
        },
    }
},
code: {},
$search: {
    mname: true
},
vnvEmpName: {}

我想检索每个块的 $search 内的所有属性。

但我不知道如何获取特定键中的键,因为我对 javascript 很陌生。

4

3 回答 3

0

您可以使用以下功能:

const objectifier = function (splits, create, context) {
    let result = context;

    for (let i = 0, key; result && (key = splits[i]); i += 1) {
      if (key in result) { result = result[key]; } else {
        result = create
          ? result[key] = {}
          : undefined;
      }
    }

    return result;
  };

看看下面的例子:

let obj = {
    '_id': {aa: 'aa'},
    'person': {
        '$search': {
            'fname': true
        },
        '_id': {'bb': 'bb'},
        'fname': {'cc': 'cc'}
    },
    'code': {'dd': 'dd'},
    'vnvEmpName': {'name': 'sdsdd'}
}


const objectifier = function (splits, create, context) {
    let result = context;

    for (let i = 0, key; result && (key = splits[i]); i += 1) {
      if (key in result) { result = result[key]; } else {
        result = create
          ? result[key] = {}
          : undefined;
      }
    }

    return result;
  };

console.log(objectifier('person.$search'.split('.'), false, obj));

// { fname: true }
于 2018-05-17T10:00:57.833 回答
0

要获取密钥,您只需使用Object.keys(yourObject) MDN Object.keys即可

您也可以使用lodash获得相同的结果

于 2018-05-17T08:52:28.710 回答
0

需要递归搜索对象

let obj = {
  _id: {},
  person: {
    $search: {
      fname: true
    },
    _id: {},
    fname: {}
  },
  code: {},
  vnvEmpName: {}
}

function findById(obj, id) {
  var result = "";
  // iterate the object using for..in
  for (var keys in obj) {
    // check if the object has any property by that name 
    if (obj.hasOwnProperty(keys) && typeof obj[keys] === 'object') {
      // if the key is not undefined get it's value
      if (obj[keys][id] !== undefined) {
        result = (obj[keys][id])
      } else {
        // else again call the same function using the new obj value
        findById(obj[keys], id)
      }
    }

  }
  return result;
}
console.log(findById(obj, 'fname'))

于 2018-05-17T09:13:26.257 回答