鉴于数据类似于: var data = [{id: 12345,
name:'my products',
items:[{
size: 'XXL',
sku: 'awe2345',
prices:[{type: 'rrp',prices: 10.99},
{type: 'sell_price', price: 9.99},
{type:'dealer', price:4.50}
]
},{
size: 'XL',
sku: 'awe2346',
prices:[{type: 'rep', prices: 10.99},
{type: 'sell_price', price: 9.99},
{type:'dealer', price:4.50}
]
}
]
}]
}]
有没有办法评估数据对象中元素的字符串表示?例如:“data [0] .items [0] .prices [0] .rrp”…不使用eval()? 解决方法: 理想的解决方案是首先没有字符串表示.认真问自己,是否更改现有代码,以更理想的输出为您提供内容. 但是,如果你不能,这应该做你想要的: var path = "data[0].items[0].prices[0].rrp".split(/[\[\]\.] /);
var next = window;
if (path[path.length - 1] == "") {
path.pop();
};
while (path.length && (next = next[path.shift()]) && typeof next == "object" && next !== null);
next;
为此创建一个函数: function get(path) {
var next = window;
path = path.split(/[\[\]\.] /);
if (path[path.length - 1] == "") {
path.pop();
};
while (path.length && (next = next[path.shift()]) && typeof next === "object" && next !== null);
return path.length ? undefined : next;
}
缺点: >变量数据必须在全局范围内才能工作(不能是局部变量). >这很邋..使用它作为最后的手段.
编辑:要使用设置功能,您可以滥用JavaScript对象的pass-by-reference性质,如下所示: function set(path, value) {
var split = Math.max(path.lastIndexOf("["), path.lastIndexOf("."));
get(path.slice(0, split))[path.slice(split 1).replace(/\]/, "")] = value;
}
提供一些解释如何工作: getter首先将输入拆分为一个数组,因此每个元素都是我们需要遍历的成员[data,0,items,0,price,0,rrp].如果搜索字符串以“]”结尾,我们会在数组末尾获得一个额外的空元素,因此我们检查并删除它. 然后我们做了大循环;所以我们有遍历的元素(而path.length),将下一个变量设置为我们需要遍历的下一个对象成员= next [path.shift()].检查它是否为对象(否则它将没有任何成员遍历),并检查它是否为null(因为typeof null ==“object”). 一旦循环执行完毕,我们将拥有链中的最后一个元素;所以归还它. setter在搜索字符串中搜索最后一个对象引用,并使用get()函数检索该对象引用.然后,它将返回的对象键设置为所需的值.如果我们没有这样做,我们一直在设置一个值而不是一个引用,所以“真正的”对象永远不会更新.
|