迭代JSON并将数组更改为字符串

时间:2014-03-04 19:51:46

标签: javascript arrays json node.js

我有一个从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)我不确定这是否会起作用,因为它可能只是单独为每个数组元素提供数据。

2 个答案:

答案 0 :(得分:2)

这个递归函数似乎适用于这个问题:

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/

答案 1 :(得分: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/