cyberwombat
cyberwombat

Reputation: 40074

Iterate through JSON and change arrays to strings

I have a JSON object that was returned from an XML to js function. This xml converter creates arrays for every entry even when they should be strings. I cannot modify this original function so therefore I would like to take my final json object, iterate through it, detect if a value is an array of length 1 and, if so, change that array to a string.

Original object:

var json = {
  user: {
     name: ["bob"],
     email: ["[email protected]"]
  },
  items: [{ 
    name: ["Object 1"]
  },{ 
    name: ["Object 2"]
  }]
}

Should become:

var json = {
  user: {
     name: "bob",
     email: "[email protected]"
  },
  items: [{ 
    name: "Object 1"
  },{ 
    name: "Object 2"
  }]
}

I have considered the reviver function but a) I would like to avoid going back to a string and b) I am not sure if that would even work as it will probably just feed me each array element individually.

Upvotes: 3

Views: 95

Answers (2)

jfriend00
jfriend00

Reputation: 707158

Here's a recursive way to do it:

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]);
    }
}

Working demo: http://jsfiddle.net/jfriend00/L5WKs/

Upvotes: 2

dfsq
dfsq

Reputation: 193261

This recursive function seems to work for this problem:

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);

Demo: http://jsfiddle.net/xkz4W/

Upvotes: 2

Related Questions