【问题标题】:how to change attribute text of json in jquery?如何在jquery中更改json的属性文本?
【发布时间】:2014-08-09 22:31:22
【问题描述】:

我正在尝试更改我的 json 对象的属性名称 /attr 名称。我尝试这样做,但什么都不会改变。我需要在看到输入 json 后制作 json 对象并将其转换为 outjson

function changeData(data){
    var title;
    for(var i = 0; i < data.length; i++){
        if(data[i].hasOwnProperty("displayName")){
            data[i]["label"] = data[i]["displayName"];
            delete data[i]["displayName"];
        }
        if(data[i].hasOwnProperty("displayDetail")){
            data[i]["title"] = data[i]["displayDetail"];
            delete data[i]["displayDetail"];
        }
        if(data[i].hasOwnProperty("inputType")){
            if(data[i]["inputType"]=="NUMBER"){
                data[i]["type"]="number"
            }else  if(data[i]["inputType"]=="TEXT"){
                data[i]["type"]="text"

            }else if(data[i]["inputType"]=="SWTICH"){
                data[i]["type"]="select"
            }
            delete data[i]["inputType"];
        }


    }
    console.log(data);
}

【问题讨论】:

  • 你为什么把数据当作一个数组?
  • 您正试图迭代一个对象,就好像它是一个数组一样。那是行不通的。 data.length 未定义。
  • 哦..对不起,我会尝试..如果你得到解决方案。请发布直到我尝试
  • 还是出不来..:(我用的是size而不是length
  • 您可能想要一个 for.. in 循环,例如for (var i in data)

标签: javascript jquery


【解决方案1】:

试试这个 - 可以通过创建一个从原始值到新值的小型查找表来删除 ifinputType 的选择:

function changeData(data) {

    var map = { NUMBER: "number", TEXT: "text", SWITCH: "select" };

    // data is an object - use for .. in to enumerate
    for (var key in data.input) {
        var e = data.input[key];   // alias for efficient structure dereferencing
        e.label = e.displayName;
        e.title = e.displayDetail;
        e.type = map[e.inputType];

        delete e.displayName;
        delete e.displayDetail;
        delete e.inputType;
    }
};

现在真的不需要 hasOwnProperty 测试 - 仅当您认为有人不安全地添加到 Object.prototype 有任何风险时才使用它。 jQuery 没有它就可以很愉快地管理,其他现代代码也应该这样做。

如果字段名称的映射不再存在,我会考虑使用另一个映射表和另一个循环来删除硬编码的复制/删除对。

【讨论】:

【解决方案2】:

我有一个很好的递归函数:

用法:

                                                // replace list
var replacedObj = replaceAttrName(sourceObject, {foo: 'foooo', bar: 'baaar'});

所以在你的情况下你可以很容易地做到:

var newObj = replaceAttrName(json, {displayDetail: 'title', displayName: 'label', inputType: 'type'});

演示:http://jsfiddle.net/h1u0kq67/15/

功能是:

function replaceAttrName(sourceObj, replaceList, destObj) {
    destObj = destObj || {};
    for(var prop in sourceObj) {
        if(sourceObj.hasOwnProperty(prop)) {
            if(typeof sourceObj[prop] === 'object') {
                if(replaceList[prop]) {
                    var strName = replaceList[prop];
                    destObj[strName] = {};
                    replaceAttrName(sourceObj[prop], replaceList, destObj[strName]);
                } else if(!replaceList[prop]) {
                    destObj[prop] = {};
                    replaceAttrName(sourceObj[prop], replaceList, destObj[prop]);
                }
            } else if (typeof sourceObj[prop] != 'object') {
                if(replaceList[prop]) {
                    var strName = replaceList[prop];
                    destObj[strName] = sourceObj[prop];
                } else if(!replaceList[prop]) {
                    destObj[prop] = sourceObj[prop];
                }
            }
        }
    } 
    return destObj;
}

【讨论】:

    【解决方案3】:

    如果我说对了,你只需要替换:

    • displayDetail => 标题

    • displayName => 标签

    • inputType => 类型。

    我想出了以下内容:

    function changeData(data){
        return JSON.parse(JSON.stringify(data).replace(/displayDetail/g, "title").replace(/displayName/g, "label").replace(/inputType/g, "type"));
    }
    

    这是Fiddle 玩。

    编辑:我忘记了“NUMBER”、“TEXT”和“SWITCH”的替换。

    function changeData(data){
        return JSON.parse(JSON.stringify(data).replace(/displayDetail/g, "title").replace(/displayName/g, "label").replace(/inputType/g, "type").replace(/TEXT/g, "text").replace(/NUMBER/g, "number").replace(/SWITCH/g, "switch"));
    }
    

    【讨论】:

    • 不,当 json 易于解析时,为什么要对 json 使用正则表达式?
    • 但还有一个问题 .inputType 可能是数字或文本,选择意味着“NUMBER”变成数字,“TEXT”变成文本
    • 是的,但这将像所有其他东西一样替代。我忽略了它;)(这里已经很晚了ggg
    • 我没有投反对票...请不要怪我
    • @ThomasJunk 我想,但这仍然不是“正确的方法”。你怎么知道它不会变成大量的 JSON?它没有那么可扩展。如果有更好的方法(不太复杂,在这种情况下另一种方法也不太复杂),您可能应该使用它,对吧?我没有数字,但这可能也比较慢。
    猜你喜欢
    • 1970-01-01
    • 2012-02-16
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2019-01-03
    相关资源
    最近更新 更多