通过使用api并获得响应。作为回应,我得到了名为object的交易中的对象列表,这些对象的计数是19。我使用下面的函数来获取'键'和'值'每个对象。但是一些最终是对象的键具有包含键和值的子对象,我已经尝试过但我无法访问它们。我已经在下面给出了api调用的响应片段。这里我能够访问索引0处于活动状态的对象,但对于业务我得到[对象对象],因为它内部有键和值,即“id”,我无法访问,我也想访问它们。
meta: Object
response: Object
deals: Array[20]
0: Object
active: 1
business: Object
id: 608290.....
下面是获取键的函数以及所有对象的值
function getAllobjectData(data) {
$.each(data.response.deals, function (i, deals) {
console.log("value of index " + i);
var keys = [],
values = [];
$.each(deals, function (key, value) {
keys.push(key);
values.push(value);
var subkey = [],
subvalue = [];
这部分我添加并尝试获取子对象的键和值,但它没有工作,我不知道这是一个正确的方法。
$.each(key, function (subkey, subvalue) { <-------------
alert(subkey + ": " + subkey); -
}); -
console.log('subkey ' + (i + 1) + ' is ' + subkey); -
console.log('subvalue ' + (i + 1) + ' is ' + subvalue); -
-----------------------------------------------------------------------------
});
console.log('keys ' + (i + 1) + ' is ' + subkey);
console.log('values ' + (i + 1) + ' is ' + subvalue);
});
}
答案 0 :(得分:2)
优雅地解决这个问题的一种方法是使用recursion。
这是一个函数示例,它将以[keyPath, value]
的形式返回数组数组:
DEMO:http://jsfiddle.net/RQuBD/1/
function collectSimpleValues(data, values, path) {
path = path || '';
values = values || [];
Object.keys(data).forEach(function (k) {
var p = path + k, v = data[k];
if (typeof v === 'object') collectSimpleValues(v, values, p + '.');
else values.push([p, v]);
});
return values;
}
答案 1 :(得分:1)
我不确定您的需求究竟是什么,但如果您只想访问Deals数组下的对象,可以按以下方式修改您的功能
function getAllobjectData(data) {
$.each(data.response.deals, function (i, deal) {
console.log("value of index " + i);
var keys = [],
values = [];
// since you are already looping through deals, no need to create another loop
console.log(deal.active); //should output 1
console.log(deal.business.id); should output 608290
// and so on...
}
答案 2 :(得分:1)
你需要在这里使用递归(如果你不知道对象的深度)。
var meta = {
response: {
deals: [
{
active: 1,
business: {
id: 608290
}
}
]
}
};
// print object
printValue(meta);
function printValue( oValue, sKey )
{
if( typeof oValue == 'object' || typeof oValue == 'array' )
{
for( i in oValue )
{
console.log( i + ' is an object' );
printValue( oValue[i], i );
}
}
else
console.log( sKey, oValue );
}
答案 3 :(得分:0)
首先,您不必在.each()上不断更改参数。每次调用该功能时,您都可以使用(k, v)
和params k&amp;&amp; v将适用于该函数内的任何内容,除非您在另一个.each()中再次使用它们。
我不确定你是JSON还是预期的结果,但是我可以通过一个小小的小提琴来帮助你了解“深潜”是多么容易。
另外,如果您不确定某个值是“字符串”还是“对象”,请不要忘记JavaScript的typeof方法。仅供参考,数组也可以显示为“对象”,如果你想要差异则使用instanceof
。虽然您可以在整个JavaScript中使用对象和数组非常相似。例如someArray["someKey"]
就像someObject["someKey"]
无论如何,在长长的小提琴上:
var TopLevel_keys = new Array(), TopLevel_values = new Array(), ulTop = $("<ul />", { class: "level-top" }).appendTo($("body"));
$.each(bob, function(k, v) {
TopLevel_keys.push(k); TopLevel_values.push(v);
ulTop.append($("<li />", { text: k }));
var Level01_keys = new Array(), Level01_values = new Array(), ul01 = $("<ul />", { class: "level-01" }).appendTo(ulTop.children("li").last());
$.each(v, function(k, v) {
Level01_keys.push(k); Level01_values.push(v);
ul01.append($("<li />", { text: k }));
var Level02_keys = new Array(), Level02_values = new Array(), ul02 = $("<ul />", { class: "level-02" }).appendTo(ul01.children("li").last());
$.each(v, function(k, v) {
Level02_keys.push(k); Level02_values.push(v);
ul02.append($("<li />", { text: k }));
etc ...