我有这样的数据结构:
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 …
给定一个JS对象
var obj = { a: { b: '1', c: '2' } }
Run Code Online (Sandbox Code Playgroud)
和一个字符串
"a.b"
Run Code Online (Sandbox Code Playgroud)
如何将字符串转换为点符号,以便我可以去
var val = obj.a.b
Run Code Online (Sandbox Code Playgroud)
如果字符串只是'a'我可以使用,'a'但这更复杂.我想有一些简单的方法,但它目前逃脱了.
我暂时坚持看似简单的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) 我正在尝试构建一个扩展对象的函数,如:
{
'ab.cd.e' : 'foo',
'ab.cd.f' : 'bar',
'ab.g' : 'foo2'
}
Run Code Online (Sandbox Code Playgroud)
进入嵌套对象:
{ab: {cd: {e:'foo', f:'bar'}, g:'foo2'}}
Run Code Online (Sandbox Code Playgroud)
喜欢这个php函数:Set :: expand()
当然不使用eval.
我想从像"User.find"这样的字符串动态调用函数.如果函数存在,脚本将在对象User中调用函数find().这是我试过的:
var User = {};
User.find = function(){
return 1;
}
var input = 'User.find';
var some_data_array = {name: 'John Doe'};
var method = input.toString().split('.');
var nameObj = method[0].substring(0,1).toUpperCase() + method[0].substring(1);
var methodToCall = method[1];
nameObj.call(methodToCall, some_data_array);
Run Code Online (Sandbox Code Playgroud)
但它总会回归:
nameObj.call(methodToCall, some_data_array);
TypeError: Object User has no method 'call'
Run Code Online (Sandbox Code Playgroud)
任何的想法?我不能使用窗口,因为它是一个node.js问题,脚本不在浏览器中执行.
我有
data =
{
'first': {
'number': 1,
'text': 'Ya.'
},
'second': {
'number': 10,
'text': 'Da.'
}
};
Run Code Online (Sandbox Code Playgroud)
我真的想要访问它像:
number = data['first.number'];
Run Code Online (Sandbox Code Playgroud)
实际上以更灵活的方式,如:
numberOrText = data[memberName+'.'+propertyName];
Run Code Online (Sandbox Code Playgroud)
是否有任何轻量级库或您可以建议的代码段?这是 - https://github.com/martinvl/KVCObject - 太酷了,但有点开销.
而使用eval不是一种好的编程习惯。这个问题是出于教学目的,或者是为了寻求更好的解决方案:
请参见以下Javascript示例:
var foo = foo || {};
foo.bar = function(str) { alert(str); };
foo.bar('aaa'); // trigger alert('aaa')
window['foo']['bar']('bbb'); // trigger alert('bbb')
Run Code Online (Sandbox Code Playgroud)
我在寻找一个通用的主叫工作,foo.bar('str'),foo.nestedObj.bar(params),foo.n2.n[1..99].bar(params)
那是因为我不能这样称呼:
param = [5,2,0];
call = 'foo.bar';
window[call](param); // not work
Run Code Online (Sandbox Code Playgroud)
但是我可以使用eval调用函数:
param = [5,2,0];
call = 'foo.bar'
eval(call + '(param)'); // works
Run Code Online (Sandbox Code Playgroud)
我该如何做而没有 eval?
有没有办法在不使用的情况下执行以下操作eval()?
以下函数接受字符串数组,其中字符串是对象名称.我迭代它们以确保它们都不是未定义的.我希望能够在不使用的情况下做到这一点eval()
function hasMissingDependencies(dependencies) {
var missingDependencies = [];
for (var i = 0; i < dependencies.length; i++) {
if (eval('typeof ' + dependencies[i]) === 'undefined') {
missingDependencies.push(dependencies[i]);
}
}
if (missingDependencies.length > 0) {
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
有了这个,我就可以传递类似下面的内容并得到我想要的东西:
alert(hasMissingDependencies(['App.FooObject', 'App.BarObject']));
Run Code Online (Sandbox Code Playgroud)
我宁愿不使用eval()但是没有找到另一种方法来检查对象名称作为字符串传递时是否未定义对象.