【问题标题】:Update Object value with String Dot Notation [duplicate]使用字符串点表示法更新对象值 [重复]
【发布时间】:2017-02-21 05:21:53
【问题描述】:
function filterResult(field, value){
    var result = [
        {
            "name": "Johnson",
            "age": "12",
            "interests": {
                "color": "red"
            }
        },
        {
            "name": "Calvin",
            "age": "24",
            "interests": {
                "color": "blue"
            }
        }
    ];
    var filter = $.map(result, function(n, i){
        //other stuff here...
        n[field] = value; //dot notation
        return n;
    });
    return filter;
}

filterResult("interests.color","black");

有没有办法将字符串点表示法 "interests.color" 转换为对象 "n[field]" 以更新值?

  • 请注意“interests.color”只是一个例子。有时水平可以更深,例如“interests.car.make.year”。动态是一种想法。

从其他帖子中得到了答案。

function setterDotNotation(obj, str, value){
    if (typeof str == 'string'){
        return setterDotNotation(obj,str.split('.'), value);
    }else if (str.length==1 && value!==undefined){
        return obj[str[0]] = value;
    }else if (str.length==0){
        return obj;
    }else{
        return setterDotNotation(obj[str[0]], str.slice(1), value);
    }
}

【问题讨论】:

标签: javascript jquery


【解决方案1】:

这里不是在处理 JSON,而是在处理一个对象(更具体地说,是一个对象数组)。

反正你可以.split()"interests.color"字符串上"."然后用两块:

var fieldNames = field.split(".");       // returns ["interests", "color"]
n[fieldNames[0]][fieldNames[1]] = value;

展开并运行以下 sn-p 以查看它在上下文中的工作:

function filterResult(field, value){
    var result = [
        {
            "name": "Johnson",
            "age": "12",
            "interests": {
                "color": "red"
            }
        },
        {
            "name": "Calvin",
            "age": "24",
            "interests": {
                "color": "blue"
            }
        }
    ];
    var filter = $.map(result, function(n, i){
        //other stuff here...
            var fieldNames = field.split(".");
            n[fieldNames[0]][fieldNames[1]] = value;
            return n;
    });
    return filter;
}

console.log( filterResult("interests.color","black") );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

【讨论】:

  • 我同意,但这对发送到此函数的任何对象都没有帮助,该函数位于第 3 层或更低层。但是我猜目前的要求可以接受
  • @buraquete - 当然可以,但是更深的嵌套仍然只是拆分然后添加一个循环以一次一层地向下导航对象的问题,即,只是超出什么的下一个逻辑步骤我已经展示过了。
  • @nnnnnn 感谢您的回答。但这只是一个带有“interests.color”的示例。有时可以更深。例如“interests.car.make.year”。我希望我可以让它更加动态,而不是硬编码关卡。
猜你喜欢
  • 1970-01-01
  • 2012-06-11
  • 2014-11-06
  • 2012-05-14
  • 1970-01-01
  • 2011-10-02
  • 2019-02-13
  • 1970-01-01
相关资源
最近更新 更多