如果我有一个对象的引用:
var test = {};
Run Code Online (Sandbox Code Playgroud)
可能(但不是立即)有嵌套对象,如:
{level1: {level2: {level3: "level3"}}};
Run Code Online (Sandbox Code Playgroud)
在最深层嵌套的对象中测试密钥是否存在的最佳方法是什么?
alert(test.level1);收益率undefined,但alert(test.level1.level2.level3);失败了.
我现在正在做这样的事情:
if(test.level1 && test.level1.level2 && test.level1.level2.level3) {
alert(test.level1.level2.level3);
}
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更好的方法.
我有这样的数据结构:
var someObject = {
'part1' : {
'name': 'Part 1',
'size': '20',
'qty' : '50'
},
'part2' : {
'name': 'Part 2',
'size': '15',
'qty' : '60'
},
'part3' : [
{
'name': 'Part 3A',
'size': '10',
'qty' : '20'
}, {
'name': 'Part 3B',
'size': '5',
'qty' : '20'
}, {
'name': 'Part 3C',
'size': '7.5',
'qty' : '20'
}
]
};
Run Code Online (Sandbox Code Playgroud)
我想使用这些变量访问数据:
var part1name = "part1.name";
var part2quantity = "part2.qty";
var part3name1 = "part3[0].name";
Run Code Online (Sandbox Code Playgroud)
part1name应该用someObject.part1.name's值填充,即"Part …
是否可以将模板字符串创建为通常的字符串
let a="b:${b}";
Run Code Online (Sandbox Code Playgroud)
然后将其转换为模板字符串
let b=10;
console.log(a.template());//b:10
Run Code Online (Sandbox Code Playgroud)
没有eval,new Function以及动态代码生成的其他方法?
我暂时坚持看似简单的JavaScript问题,但也许我只是错过了正确的搜索关键字!
假设我们有一个对象
var r = { a:1, b: {b1:11, b2: 99}};
Run Code Online (Sandbox Code Playgroud)
有几种方法可以访问99:
r.b.b2
r['b']['b2']
Run Code Online (Sandbox Code Playgroud)
我想要的是能够定义一个字符串
var s = "b.b2";
Run Code Online (Sandbox Code Playgroud)
然后使用访问99
r.s or r[s] //(which of course won't work)
Run Code Online (Sandbox Code Playgroud)
一种方法是为它编写一个函数,在字符串上拆分字符串,也可以递归/迭代地获取属性.但是有更简单/更有效的方法吗?在这里的任何jQuery API中有用吗?
在javascript中考虑这个对象,
var obj = { a : { b: 1, c: 2 } };
Run Code Online (Sandbox Code Playgroud)
给定字符串"obj.ab"我如何获得这个引用的对象,以便我可以改变它的值?即我希望能够做类似的事情
obj.a.b = 5;
obj.a.c = 10;
Run Code Online (Sandbox Code Playgroud)
其中"obj.ab"和"obj.ac"是字符串(不是obj引用).我遇到过这篇帖子,我可以得到点符号字符串引用obj的值,但我需要的是一种可以获取对象本身的方法吗?
物体的嵌套可能比这更深.也许是
var obj = { a: { b: 1, c : { d : 3, e : 4}, f: 5 } }
Run Code Online (Sandbox Code Playgroud) 可能重复:
Javascript使用变量作为对象名称
如何让JS将字符串视为对先前定义的对象的引用?简化:
var myObject = new MyObject();
var myString = "myObject";
var wantThisToWork = myString.myproperty;
Run Code Online (Sandbox Code Playgroud) 我有一个如下所示的对象:
const arr = [
{
name: 'FolderA',
child: [
{
name: 'FolderB',
child: [
{
name: 'FolderC0',
child: [],
},
{
name: 'FolderC1',
child: [],
},
],
},
],
},
{
name: 'FolderM',
child: [],
},
];
Run Code Online (Sandbox Code Playgroud)
我有一个字符串的路径:
var path = "0-0-1".
Run Code Online (Sandbox Code Playgroud)
我必须删除该对象:
{
name: 'FolderC1',
child: [],
},
Run Code Online (Sandbox Code Playgroud)
我可以这样做,
arr[0].child[0].splice(1, 1);
Run Code Online (Sandbox Code Playgroud)
但我想动态地做.由于路径字符串可以是任何东西,我想要上面的"." 要动态创建的运算符和拼接定义,以便在特定位置进行拼接.
给定一个字符串作为点符号,我将如何从该字符串创建一个对象(检查已存在的属性):例如
var obj = {};
stringToObj('a.b', 'value1', obj);
stringToObj('a.b.c', 'value2', obj);
Run Code Online (Sandbox Code Playgroud)
会产生
{
"a": {
"b": {
"_x": "value1",
"c": {
"_x": "value2"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
我有一堆对象属性以点分隔的字符串形式出现"availability_meta.supplier.price",我需要为其分配相应的值record['availability_meta']['supplier']['price']等等.
并非所有东西都是3级深度:许多只有1级深度,而且许多深度超过3级.
有没有一种很好的方法在Javascript中以编程方式分配?例如,我需要:
["foo.bar.baz", 1] // --> record.foo.bar.baz = 1
["qux.qaz", "abc"] // --> record.qux.qaz = "abc"
["foshizzle", 200] // --> record.foshizzle = 200
Run Code Online (Sandbox Code Playgroud)
我想我可以一起破解某些东西,但我没有任何好的算法,所以会很感激建议.我正在使用lodash,如果它有用,并对其他可以快速完成此工作的库开放.
编辑它在后端并且不经常运行,因此没有必要优化大小,速度等.实际上代码可读性对于未来的开发者来说将是一个加分.
编辑2这与引用的副本不同.也就是说,我需要能够为同一个对象多次执行此分配,并且"重复"答案将每次只覆盖子键.请重新开启!
上下文:我正在为我的应用程序设置编写一个 Redux reducer(尽管这个问题不是 Redux 特定的),它是一个嵌套对象。我想使用动态给出的属性名称修改设置对象。
例子:
const settings = {
service: {
username: 'TEST',
password: ''
}
}
// Normally this would be passed by Redux, but for the purposes of this exercise it's hardcoded
const settingKey = 'service.username';
console.log(settings[settingKey]); // undefined
console.log(eval(`settings.${settingKey}`)); // works, but badRun Code Online (Sandbox Code Playgroud)
我能想到在不使用 eval 的情况下访问子对象的唯一方法是使用正则表达式将其拆分settingKey为其组成部分:
const match = /(.+)\.(.+)/.exec(settingKey);
console.log(settings[match[1]][match[2]];
Run Code Online (Sandbox Code Playgroud)
const match = /(.+)\.(.+)/.exec(settingKey);
console.log(settings[match[1]][match[2]];
Run Code Online (Sandbox Code Playgroud)
这有效,但是
有没有一种方法可以在不使用正则表达式或 eval 的情况下使用动态名称访问嵌套对象的属性?
javascript ×10
object ×5
jquery ×2
nested ×2
arrays ×1
ecmascript-6 ×1
eval ×1
lodash ×1
path ×1
properties ×1
syntax ×1