【问题标题】:Javascript Object push() functionJavascript 对象 push() 函数
【发布时间】:2012-02-14 02:21:30
【问题描述】:

我有一个 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 不是函数。我明白为什么它与数组不同,但我能做些什么呢?

【问题讨论】:

  • 看起来你应该只使用一个数组
  • 而不是 tempData.push( 数据 );写这个 tempData[index] = data.所以你不会失去订单。

标签: javascript json


【解决方案1】:

push() is for arrays,不是objects,所以使用正确的数据结构。

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;

【讨论】:

  • +1 击败了我。不要忘记更改 for...in 循环。
  • @MattBall 我的错!我真的不擅长 SO 审查和东西! :)
  • push是针对数组的,有没有办法给对象添加数组?
  • 关联数组呢?
  • @KinnardHockenhull 对不起,我不明白这个问题。你能澄清你在问什么吗?
【解决方案2】:

对象不支持push属性,但是你也可以用索引作为key来保存,

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 解决当前问题
【解决方案3】:

你必须让var tempData = new Array();

Push 是一个数组函数。

【讨论】:

  • 为什么是new Array() 而不是[]
  • [] 是创建新数组的替代方法(快捷方式)。它可以用 [] 和 new Array() 来制作。
  • [] 是创建数组的主要方式,其他是替代方式,甚至可以被覆盖。
  • 参见stackoverflow.com/questions/885156/…,了解为什么new Array() 是邪恶的
  • w3schools.com/js/js_obj_array.asp new Array 是常规数组。其中 [] 定义为主要的?
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    我假设你真的从服务器获取对象并希望在输出中获取对象

    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);

    【讨论】:

      【解决方案6】:

      希望这篇文章对你有帮助。

      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)

      【讨论】:

        【解决方案7】:
            tempData.push( data[index] );
        

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

        【讨论】:

        • 请详细描述如何解决问题。谢谢。
        • 这将纠正 Matt Ball 接受的答案。当我们循环遍历数据时,我们应该只推送 data[index],而不是完全推送数据。
        【解决方案8】:

        做:

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

        【讨论】:

        • 为什么是new Array() 而不是[]
        • 注意 new Array(); 的区别和新数组;您应该能够回答此类问题,而不是谈论替代方案..
        猜你喜欢
        • 1970-01-01
        • 2013-05-29
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-04
        • 2011-08-22
        相关资源
        最近更新 更多