改进将点符号中的序列化对象转换为js对象的功能

时间:2016-06-13 09:01:56

标签: javascript

我有字符串var obj = {presentation: {launchBehavior: 'newWindow'}} ,需要反序列化为对象:

function des(obj, property, index, ar) {
    var isLastCall = ar.length - 1 === index;
    if (isLastCall) {
        return;
    }

    var isNextLastCall = ar.length - 2 === index;
    if (isNextLastCall) {
        obj[property] = ar[ar.length - 1];
        return obj;
    } else {
        obj[property] = {};
        return obj[property];
    }
}

var obj = {};
"presentation.launchBehavior.newWindow".split(".").reduce(des, obj);
obj.presentation.launchBehavior // newWindow

dot之后的最后一个字符串应该是value,而其他字符串应该转换为字符串。我已经写了这样做的功能:

<p align="center"><img src="http://www.ifn-modern.com/skin/frontend/fortis/default/images/phone.png" alt="" width="50" height="50">
Lorem .</p>

p img{
  display:inline-block;
  vertical-align:middle;
  margin-right:5px;
}

它正在工作,但我想改进它以返回结果对象而不必在函数外创建变量。我怎样才能做到这一点?也许功能的内部也可以改进。

2 个答案:

答案 0 :(得分:2)

您可以使用(*foo)[i][j]

reduceRight

答案 1 :(得分:1)

我会这样做。

&#13;
&#13;
function des(str) {
  var props = (typeof str === "string") ? str.split('.') : str;
  return props.length > 1 ? {[props[0]]: des(props.slice(1))}
                           : props[0];
}

console.log(des("presentation.launchBehavior.newWindow"));
&#13;
&#13;
&#13;

它使用数组计算属性(var o = {[key]: val})。它可能无法在旧浏览器上运行。对于旧浏览器,您必须首先创建对象assign then属性(var o = {}; o[key] = val;)。