gpt4 book ai didi

javascript - 从字符串引用 Javascript 对象

转载 作者:搜寻专家 更新时间:2023-11-01 05:16:16 25 4
gpt4 key购买 nike

给定的数据类似于:

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;
}

缺点:

  1. 变量 data 必须在全局范围内才能工作(不能是局部变量)。

  2. 这很恶心。将其用作最后的手段。

编辑:要使用设置功能,您可以滥用 JavaScript 对象的按引用传递特性,如下所示:

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, prices, 0, rrp]。如果搜索字符串以“]”结尾,我们会在数组末尾得到一个额外的空元素,因此我们检查并删除它。

然后我们进行大循环;所以当我们有要遍历的元素时 (while path.length),将 next 变量设置为我们需要遍历的下一个对象成员 next = next[path.转移()] 。检查它是否是一个对象(否则它不会有任何要遍历的成员),并检查它是否不为空(因为 typeof null == "object")。

一旦循环执行完毕,我们就会得到链中的最后一个元素;所以返回。

setter 搜索搜索字符串中的最后一个对象引用,并使用 get() 函数检索该对象引用。然后它将返回的对象键设置为所需的值。如果我们没有这样做,我们将一直设置一个值而不是一个引用,因此“真实”对象将永远不会更新。

关于javascript - 从字符串引用 Javascript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6898288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com