Javascript对象push()函数


101

我有一个javascript对象(我实际上是通过ajax请求获取数据的):

var data = {};

我添加了一些东西:

data[0] = { "ID": "1"; "Status": "Valid" }
data[1] = { "ID": "2"; "Status": "Invalid" }

现在,我要删除状态无效的所有对象(但保持所有顺序相同):

var tempData = {};
for ( var index in data ) {
    if ( data[index].Status == "Valid" ) {
        tempData.push( data );
    }
}
data = tempData;

在我看来,所有这些都应该起作用,但是我收到的错误tempData.push不是函数。我知道为什么它与数组不一样,但是我该怎么办?


4
看来您应该只使用一个数组
Esailija'1

Answers:


131

push()是用于数组,而不是对象,因此请使用正确的数据结构。

var data = [];
// ...
data[0] = { "ID": "1", "Status": "Valid" };
data[1] = { "ID": "2", "Status": "Invalid" };
// ...
var tempData = [];
for ( var index=0; index<data.length; index++ ) {
    if ( data[index].Status == "Valid" ) {
        tempData.push( data );
    }
}
data = tempData;

9
+1击败了我。也不要忘记更改for...in循环。
Andy E

@MattBall,我不好!我不是那么擅长SO评论和工作!:)
Shouvik

1
推送是针对数组的,有没有办法向对象添加数组?
2015年

1
关联数组呢?
Kinnard Hockenhull

@KinnardHockenhull对不起,我不明白这个问题。您能澄清您的要求吗?
马特·鲍尔

17

对象不支持push属性,但是您也可以使用索引作为键来保存它,

var tempData = {};
for ( var index in data ) {
  if ( data[index].Status == "Valid" ) { 
    tempData[index] = data; 
  } 
 }
data = tempData;

我认为,如果这样做可以删除状态无效的对象,则更容易。

for(var index in data){
  if(data[index].Status == "Invalid"){ 
    delete data[index]; 
  } 
}

最后,您不需要创建var temp –


与答案添加一些解释如何回答帮助OP在固定电流问题
ρяσѕρєяķ

5

你必须 var tempData = new Array();

推是数组函数。


9
为什么new Array()[]呢?
马特·鲍尔

3
[]是创建新数组的替代方法(快捷方式)。可以使用[]和新的Array()来实现。
Alex Dn 2012年

6
[]是创建数组的主要方法,其他是替代方法,甚至可以覆盖。
Esailija

6
参见stackoverflow.com/questions/885156/…,了解关于为什么new Array()邪恶的讨论
JonasHøgh2012年

w3schools.com/js/js_obj_array.asp new数组是常规数组。哪里[]定义为主要?
Alex Dn 2012年

3

Javascript编程语言支持函数式编程范例,因此您可以轻松地使用这些代码。

var data = [
    {"Id": "1", "Status": "Valid"},
    {"Id": "2", "Status": "Invalid"}
];
var isValid = function(data){
    return data.Status === "Valid";
};
var valids = data.filter(isValid);

2

我假设您确实是从服务器获取对象,并且想要在输出中获取对象

Object.keys(data).map(k=> data[k].Status=='Invalid' && delete data[k])


0
    tempData.push( data[index] );

我同意上面的正确答案,但是....您仍然没有提供要添加到tempData的数据的索引值。没有[index]值,将添加整个数组。


请详细描述如何解决该问题。谢谢。
Leonid Glanz 2015年

这将是纠正Matt Ball接受的答案。在遍历数据时,我们应该只推送data [index],而不要完全推送数据。
乔纳森·贝杰隆

-2

做:


var data = new Array();
var tempData = new Array();


4
为什么new Array()[]呢?
马特·鲍尔

注意new Array()之间的区别;和新的数组;您应该能够回答这样的问题,而不是讲述的替代品..
乔纳森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.