JavaScript对象的push()函数

126

我有一个 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不是一个函数。我知道它不同于数组,但是我还有其他的选择吗?


5
看起来你应该只是使用一个数组。 - Esailija
1
不要使用tempData.push(data),而是使用tempData[index] = data,这样你就不会失去顺序。 - Hyzyr
10个回答

160

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;

10
+1 beat me to it. Don't forget to change the for...in loop, too.+1 比我先发了。别忘了也要改变 for...in 循环。 - Andy E
@MattBall 我不好意思!我并不是很擅长于SO的审查和其他相关事项! :) - Shouvik
1
Push 用于数组,有没有办法将一个数组添加到对象中? - Venkat
1
关于关联数组呢? - Kinnard Hockenhull
@KinnardHockenhull 对不起,我不明白你的问题。你能解释一下你在问什么吗? - Matt Ball
将 tempData.push( data ) 更改为 tempData.push( data[index] ),以避免推送整个数组。 - RollingInTheDeep

25

对象不支持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]; 
  } 
}

最后,您不需要创建一个名为temp的变量 -


为解决当前的问题,给出一些说明性的答案以帮助OP。 - ρяσѕρєя K

6

您需要执行以下操作:var tempData = new Array();

Push是一个数组函数。


12
为什么使用 new Array() 而不是 [] - Matt Ball
4
[]是创建新数组的一种替代(快捷)方式。它可以使用[]或new Array()来创建。 - Alex Dn
6
[] 是创建数组的主要方式,其他方法是可替代的,甚至可以被覆盖。 - Esailija
7
请参见https://dev59.com/u3NA5IYBdhLWcg3wn_fD,讨论为什么`new Array()`是有害的。 - Jonas Høgh
1
http://www.w3schools.com/js/js_obj_array.aspnew Array 是常规数组。[] 被定义为原始值吗? - Alex Dn
显示剩余6条评论

5

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

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

3

我希望这可以帮助到您。

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

let tempData = [];

tempData= data.filter((item)=>item.Status!='Invalid')

console.log(tempData)


2
    tempData.push( data[index] );

我同意上面的正确答案,但是你仍然没有给出想要添加到tempData中的数据的索引值。如果没有[index]值,则整个数组都将被添加。

请详细描述如何解决问题。谢谢。 - Leonid Glanz
这是对Matt Ball所接受的答案进行更正。当我们循环遍历数据时,我们应该只push data[index]而不是整个data。 - Jonathan Bergeron

2
我假设你确实从服务器获取了对象,并希望在输出中得到该对象。最初的回答。
Object.keys(data).map(k=> data[k].Status=='Invalid' && delete data[k])

var data = { 5: { "ID": "0", "Status": "Valid" } }; // some OBJECT from server response

data = { ...data,
  0: { "ID": "1", "Status": "Valid" },
  1: { "ID": "2", "Status": "Invalid" },
  2: { "ID": "3", "Status": "Valid" }
}

// solution 1: where output is sorted filtred array
let arr=Object.keys(data).filter(k=> data[k].Status!='Invalid').map(k=>data[k]).sort((a,b)=>+a.ID-b.ID);
  
// solution2: where output is filtered object
Object.keys(data).map(k=> data[k].Status=='Invalid' && delete data[k])
  
// show
console.log('Object',data);
console.log('Array ',arr);


1

Mozilla实际上展示了如何使用push处理对象,通过将push链接到call方法:

“push是有意通用的,我们可以利用它。 Array.prototype.push可以在对象上很好地工作,正如这个例子所示。

请注意,我们不创建一个数组来存储一组对象。相反,我们将集合存储在对象本身上,并使用Array.prototype.push上的call来欺骗该方法,使其认为我们正在处理一个数组,而且它只需要按照JavaScript允许我们以任何方式建立执行上下文的方式工作即可。

const obj = {
  length: 0,

  addElem(elem) {
    // obj.length is automatically incremented
    // every time an element is added.
    [].push.call(this, elem);
  },
};

// Let's add some empty objects just to illustrate.
obj.addElem({});
obj.addElem({});
console.log(obj.length);
// → 2

请注意,尽管 obj 不是一个数组,但 push 方法成功地增加了 obj 的 length 属性,就像我们处理实际数组一样。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push


0

你之所以会遇到这个错误,是因为 data.push 只能用于数组,而不能用于对象。

所以你可以这样做:

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[index] = data[index];
}
}
data = tempData;

enter image description here


-2

做:


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


5
为什么要用 new Array() 而不是 [] - Matt Ball
注意 new Array(); 和 new Array; 的区别,你应该能够回答这样的问题,而不是讲述替代方案。 - Jonathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接