我有这个json
var json = {
"I:5.3": {
"conf": {
"name": "Jack"
}
}
}
和这个字符串
var str = '["I.5.3"]["conf"]'
如何从
这样的json获取str值json["I.5.3"]["conf"]
我有json对象和str,我必须提取类似
json[str] = json["I.5.3"]["conf"]
答案 0 :(得分:0)
您的标题表明您希望获得:
但是,您显示的所有代码都是一个普通的JavaScript对象。没有数组可见...而且我只能找到的字符串值是“ Jack”。
杰克将被提取为json["I.5.3"]["conf"]["name"]
。
或通过点符号=>
const obj = json["I.5.3"];
const nameValue = obj.conf.name; // => Jack
答案 1 :(得分:0)
我相信,您必须将字符串分成多个单独的部分。
var str = '["I.5.3"]["conf"]';
var identifiers = str.split('][');
// identifiers would be an array like:
// ["I.5.3", "conf"]
var person = json[identifiers[0]][identifiers[1]];
// person = {
// "name": "Jack"
// }
String.prototype.split()允许您将字符串的各个部分分成一个数组。查看MDN文档以了解有关该特定方法的更多信息。
这个特定的答案希望您将始终分割属性 ,如果缺少这些属性,则会出错。为了安全起见,建议您在尝试访问该对象之前先检查该对象是否包含所需的属性。
var str = '["I.5.3"]["conf"]';
var identifiers = str.split('][');
try {
var myVal;
// Let's check if the property exists.
if (Object.prototype.hasOwnProperty.call(json, identifiers[0]){
myVal = json[identifiers[0]];
if (Object.prototype.hasOwnProperty.call(myVal, identifiers[1]){
myVal = myVal[identifiers[1]];
}
}
} catch(error) {
// One of the properties didn't exist or something went wrong in the try
// block above.
}
编辑: 以下内容将专门格式化您的字符串以符合匹配条件,从而成为一个数组。如果每个数组项中的任何地方都有单引号或双引号,则可能会出现这种情况,因此请注意。
var myArray = str.slice(2, -2).split('][').map(function(item) {
return item.replace('"', '');
});
String.prototype.slice()提取字符串的一部分并将其作为新字符串返回,而无需修改原始字符串。
然后split方法将其分为不同的数组项。然后,我们遍历数组中的每个项目并删除其他"
。再说一遍,如果原始字符串看起来像['one']['two']
,这将崩溃。如果字符串看起来像["can't"]["won't"]
,那么这也不可靠。因此,请注意您的特定情况。如果您确定该字符串将始终符合您上面的格式,那么您可以依靠它。
答案 2 :(得分:0)
您有2种方法(至少现在是我的想法):
第一种方法
var json = {
"I:5.3": {
"conf": {
"name": "Jack"
}
}
}
var str = '["I:5.3"]["conf"]'
var scr_line = 'json'+str;
var target = eval(scr_line);
console.log(target);
第二种方式:
var json = {
"I:5.3": {
"conf": {
"name": "Jack"
}
}
}
var str = '["I:5.3"]["conf"]';
let ret = getVal(json, str);
console.log(ret);
function getVal(obj, path){
var regex = /\["(.*?)"\]/mg;
let m;
while ((m = regex.exec(path)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
if(typeof obj[m[1]] !== 'undefined') obj = obj[m[1]];
else return obj[m[1]];
}
return obj;
}
我希望使用第二个,因为它会检查对象上的属性是否存在