【问题标题】:Iterate through JSON and change arrays to strings遍历 JSON 并将数组更改为字符串
【发布时间】:2014-04-06 13:22:22
【问题描述】:

我有一个从 XML 到 js 函数返回的 JSON 对象。这个 xml 转换器为每个条目创建数组,即使它们应该是字符串。我无法修改这个原始函数,因此我想获取我的最终 json 对象,遍历它,检测一个值是否是长度为 1 的数组,如果是,则将该数组更改为字符串。

原始对象:

var json = {
  user: {
     name: ["bob"],
     email: ["bob@example.org"]
  },
  items: [{ 
    name: ["Object 1"]
  },{ 
    name: ["Object 2"]
  }]
}

应该变成:

var json = {
  user: {
     name: "bob",
     email: "bob@example.org"
  },
  items: [{ 
    name: "Object 1"
  },{ 
    name: "Object 2"
  }]
}

我已经考虑过 reviver 函数,但是 a) 我想避免返回到字符串 b) 我不确定这是否可行,因为它可能只是单独为我提供每个数组元素。

【问题讨论】:

  • 这很难,因为它必须是递归的。我觉得你应该在它发生时处理这个案子,通过简单的检查if ($.isArray(val) && val.length == 1) {...}。要么让后端程序员返回你需要的东西,而无需你修改它。
  • 如果你要做很多这样的事情,值得注意的是lodash 是一个优秀的库。
  • @BenjaminRH 你是说 lodash 有这个功能吗?还是您建议使用其中一种递归函数并应用我自己的过滤器?
  • 它没有解决这个特定情况的函数,我只是说它有很多有用的函数来迭代和操作数组和对象,例如_.forEach_.isObject,和_.isArray
  • @Yashua 例如,这是接受的答案,使用 lodash:jsfiddle.net/YnFyS

标签: javascript arrays json node.js


【解决方案1】:

这个递归函数似乎可以解决这个问题:

function simplify(obj) {
    for (var k in obj) {
        if (Object.prototype.toString.call(obj[k]) == '[object Array]' && obj[k].length == 1) {
            obj[k] = obj[k][0];
        }
        else if (typeof obj[k] == 'object') {
            obj[k] = simplify(obj[k]);
        }
    }
    return obj;
}

simplify(json);

演示:http://jsfiddle.net/xkz4W/

【讨论】:

  • 几乎 - 我需要在第一个添加 obj[k] = simplify(obj[k]); 以及 - 我的例子并不像我的真实东西那么复杂,它有一些深度递归问题。如果您愿意,请编辑答案...
【解决方案2】:

这是一种递归方式:

function flattenArrays(data) {

    function processItem(item) {
        if (Array.isArray(item)) {
            if (item.length === 1 && typeof item[0] === "string") {
                data[prop] = item[0];
            } else {
                for (var i = 0; i < item.length; i++) {
                    processItem(item[i]);
                }
            }
        } else if (typeof item === "object") {
            flattenArrays(item);
        }
    }

    for (var prop in data) {
        processItem(data[prop]);
    }
}

工作演示:http://jsfiddle.net/jfriend00/L5WKs/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 2018-01-28
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    相关资源
    最近更新 更多