遍历嵌套的javascript对象以标识空值属性

时间:2015-05-30 19:19:45

标签: javascript nested

如果我有一个物体:

var dog= {
  name: "Max",
  age: 5,
  sex: undefined,
  details: {
    color: "black",
    breed: undefined
  }
}

我想用未定义的值获取属性的路径。我怎么能遍历所有属性,包括嵌套的属性?

目前,我有一个没有嵌套属性的对象的vanilla js方法:

function getUndefinedPaths(o, name) {
  var paths = [];
  for (var prop in o) {
    if (o[prop] === undefined) {
        paths += name + "." + prop + "\n";
    }
  }
  return paths;
}

// getUndefinedPaths(dog, "dog") only returns "dog.sex" and not "dog.details.breed" which is also undefined.

我被困住了。有人可以帮助了解如何在js对象的嵌套属性中获取这些未定义值的路径吗?我只是在vanilla javascript中尝试这个。提前谢谢。

2 个答案:

答案 0 :(得分:1)

你可以像这样使用递归函数:

function getPath(obj, path) {

    var props = [];    

    for(var key in obj) {

        if(obj[key] === undefined) {
            props.push(path + '.' + key);
        }

        if(obj[key] instanceof Object) {
            props.push.apply(props, getPath( obj[key], path + '.' + key ));
        }

    }

    return props;
}


var path = getPath(dog, 'dog');

这将返回Arrayundefined属性

的路径

如果需要,您可以在生成的'Array'上使用join来获取String

console.log(path.join('\n'));

答案 1 :(得分:0)

我们现在使用object-scan进行这样的数据处理。每次都很难重新发明轮子。这是它的工作方式

const objectScan = require('object-scan');

const find = (data) => objectScan(['**'], {
  joined: true,
  filterFn: ({ value }) => value === undefined
})(data);

const dog = {
  name: 'Max',
  age: 5,
  sex: undefined,
  details: {
    color: 'black',
    breed: undefined
  }
};

console.log(find(dog));
// => [ 'details.breed', 'sex' ]