2014-04-05 36 views
0

比方说,我有这样的对象数组:从一个键值对对象的JavaScript中拔出钥匙

[300: {a:"some", b:"value"}, 301: {a: "another", b: "val"} ...] 

我有一个类型的对象,我使用迭代递归函数,而且也没有办法,我会改变我的计数器在300,我总是从0开始。

我想到了一个解决方案,从agrray取出钥匙,让我有这样一个数组:

[{a:"some", b:"value"}, {a: "another", b: "val"} ...] 

我如何在JavaScript中做到这一点?另外,如果有另一种方法比创建一个可以删除密钥的函数快得多,它会好很多。

+3

你知道你有什么仅仅是一个数组,属性'300','301'等,对吗? – thefourtheye

+0

啊,是的,使用Array这个词会更好,谢谢 –

+0

实际上你的期望输出是一个对象数组,但是你的实际数组根本没有元素。 – thefourtheye

回答

1

这会给你一个语法错误(语法错误:缺少]之后的元素列表):

var data = [300: {a:"some", b:"value"}, 301: {a: "another", b: "val"}]; 

你的意思是这样的:

var data = {300: {a:"some", b:"value"}, 301: {a: "another", b: "val"}}; 

而将其转换成一个数组,环比对象并将每个值推入新阵列:

var arr = []; 
for (var k in data) { 
    arr.push(data[k]); 
} 

Fiddle

+0

实际上,当我查看我的代码的反复对象时,是的,它不在'[]'中,它在'{}'中,不知道为什么我认为它是在'[]' –

1

这里有一点需要澄清。当你有一个数组从300开始作为索引的对象时,这意味着你有300个索引,其值为undefined,但如果它只是一个Array-like对象,它可能完全不同。

比方说,这不是一个数组类,是一个实际的Array,所以你必须把它过滤,使所有的undefined值也会从你数组中删除,所以您的阵列应该是这样的:

var arr = [/*0*/undefined, ..,/*299*/undefined, /*300*/{a:"some", b:"value"}, /*301*/ {a: "another", b: "val"} ...] 
var result = arr.filter(function(value,index){ 
    return (value !== undefined); 
}); 

但你在你的问题中提到,更可能一个JavaScript对象,所以,做你想做,你可以做什么:

var myObj = {300: {a:"some", b:"value"}, 301: {a: "another", b: "val"} }; 
var result = {}; 
for(var key in obj){ 
    if(obj.hasOwnProperty(key)){ 
     result.push(obj[key]); 
    } 
} 
在此

for循环hasOwnProperty功能可以帮助你确保,如果它是一个实际对象价值es,而不是来自对象原型链的其他可能的键。

1

如果你的意思是说数组的初始结构是这样的:

var data = [{300: {a:"some", b:"value"}}, {301: {a: "another", b: "val"}}]; 

那么这应该工作(结果排列):

var result = []; 
var data = [{300: {a:"some", b:"value"}}, {301: {a: "another", b: "val"}}]; 
for(var i =0; i < data.length; i++){ 
    for(var key in data[i]) { 
     if(data[i].hasOwnProperty(key)) { 
      result.push(data[i][key]); 
      break; 
     } 
    } 
}