首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果元素不是对象,则获取嵌套JSON对象的键名和值

如果元素不是对象,则获取嵌套JSON对象的键名和值
EN

Stack Overflow用户
提问于 2018-07-17 02:43:31
回答 2查看 2.8K关注 0票数 0

我有一个对象,它的键我不知道,但结构基本上是一样的。值可以是字符串,也可以是字符串/对象的另一个对象。下面是一个示例:

代码语言:javascript
复制
d = {
  "name": "Sam",
  "grade": 9,
  "classes": {
    "a": 1,
    "b": 2
  },
  "age": null
}

我现在想要的是,如果value不是另一个对象,那么获取键名和它的值。如果value为null,则返回空字符串。根据以上内容,预期输出为:

代码语言:javascript
复制
name=Sam, grade=9, a=1, b=2, age=''

在这里,因为classes是object,所以必须再次循环以获得键(a,b)和值(1,2)。

我尝试了以下方法,但如果其中任何一个值为null,它都会返回错误:

代码语言:javascript
复制
Cannot convert undefined or null to object

如果没有空值,它会工作得很好:

代码语言:javascript
复制
function getKeyValues(data) {
  var q = '';

  f(data);

  function f(s) {
    Object.keys(s).forEach(function(key) {
      if (typeof s[key] === 'object') {
        f(s[key]);
      } else {
        q = q + key + '=' + (s[key] == null) ? "" : s[key] + '&';
      }
    });
  }
  return q;
}

d = {
  "name": "Sam",
  "grade": 9,
  "classes": {
    "a": 1,
    "b": 2
  },
  "age": null
}

console.log(getKeyValues(d));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-17 03:02:57

试试这个:

代码语言:javascript
复制
function getKeyValues(data) {
    var q = [];
    var keys = Object.keys(data);
    for (var i = 0; i < keys.length; i++) {
        var key = keys[i];
        var value = data[key];
        if (value == null) {
            q.push(key + "=''");
        } else if (typeof value == "object") {
            q.push(getKeyValues(value));
        } else {
            q.push(key + "=" + value);
        }
    }
    return q.join(",");
}
票数 2
EN

Stack Overflow用户

发布于 2018-07-17 03:17:32

另一种方法是使用reduce方法。就我个人而言,我觉得它更干净一点。

代码语言:javascript
复制
function getKeyValues(d) {
    return Object.keys(d).reduce((memo, key) => {
        if (!d[key]) {
            memo[key] = '';
        } else if (typeof d[key] === 'object') {
            Object.keys(d[key]).forEach((subKey) => {
                memo[subKey] = d[key][subKey];
            })
        } else {
            memo[key] = d[key];
        }
        return memo;
    }, {})
}

另外,虽然你的问题很清楚,但我必须说,这也让我有点警惕。如果属性名称在嵌套对象中重复,您可能会发现自己处于一些困难的调试环境中。例如,如果

代码语言:javascript
复制
d={"name":"Sam","grade":9,"buddy":{"name":"Jeff","age":12}}

你希望名字是"Sam“还是"Jeff"?回答你的问题的函数也可以返回,所以这是需要注意的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51368281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档