修改每个JSON对象的值

时间:2015-09-03 11:18:30

标签: javascript json

我正在处理这个以JSON格式返回值的JS文件。 我需要在每个字符串值的开头和结尾添加一个成员函数@。我无法弄清楚如何做到这一点。文件的内容是这样的,但可能有任意数量的对象

var SomeText = function () {
    return {
        "CommonText":
        {
            "ViewAll": "View All",
            "SignOut": "Sign out",
            "More": "More",
            "New": "New"
        },
        "ErrorText": {
            "Tag": "Error !",
            "EmptyGridMessage": "You do not have any {0}"
        },
    };
};

这里我需要在每个字符串值附加@。例如。对于标记/错误名称值对,我需要将其转换为“@Error!@”。

3 个答案:

答案 0 :(得分:3)

这是一种使用递归的通用方法,与其他解决方案不同,它将更改对象中的所有字符串,无论它们处于什么级别:

  var myObj = {
        "CommonText":
        {
            "ViewAll": "View All",
            "SignOut": "Sign out",
            "More": "More",
            "New": "New"
        },
        "ErrorText": {
            "Tag": "Error !",
            "EmptyGridMessage": "You do not have any {0}"
        },
    };
    function deepStringConcat(myObj) {
        function walker(obj) {
            var k, has = Object.prototype.hasOwnProperty.bind(obj);
            for (k in obj) if (has(k)) {
                switch (typeof obj[k]) {
                    case 'object':
                        walker(obj[k]); break;
                    case 'string':
                        obj[k] = '@' + obj[k] + '@';
                }
            }
        }
        walker(myObj);
    };
    deepStringConcat(myObj);
    console.log(myObj);

Fiddle

答案 1 :(得分:1)

这是我的解决方案,使用递归函数将@仅添加到字符串并迭代对象。

function appendAt (text) {
    for (var t in text) {
        if (text.hasOwnProperty(t) && typeof text[t] === "string") {
            text[t] = '@' + text[t] + '@';
        }
        if (typeof text[t] === "object") {
            appendAt(text[t]);
        }
    }
    return text;
}

// run the function
var text = SomeText();
console.log(text); // normal output
appendAt(text);
console.log(text); // output with appended @ at begin/end of each string

答案 2 :(得分:1)

你可以尝试这样的事情。它只会改变你问题所示的第一级:

// get the object returned by SomeText
var output = SomeText();

// for each object property rewrite the value
// using the updateObject function
Object.keys(output).forEach(function (obj) {
  output[obj] = updateObject(output[obj]);
});

function updateObject(obj) {

  // for each property in the object, update the value
  Object.keys(obj).forEach(function (el) {
    obj[el] = '@' + obj[el] + '@';
  });
  return obj;
}

DEMO