确定JSON对象的最后一个元素

时间:2017-07-19 07:32:56

标签: javascript ajax

我的服务器(PHP)响应JSON对象,就像这样的数据:

{

    "0": {
        "action_id": "80",
        "action_transaction_id": "5743",
        "action_matched_email": "test_1@gmail.com",
        "action_by_user": "user1",
        "action_count": "0",
        "action_date": "2017-07-19 15:01:26"
    },
    "1": {
        "action_id": "1",
        "action_transaction_id": "1",
        "action_matched_email": "Admin@email.com",
        "action_by_user": "ADMIN",
        "action_count": "4",
        "action_date": "2017-07-19 15:10:08"
    },
    "new_count": {
        "action_count": "4"
    }
}

数据不受限制,有时服务器会抛出许多数据。这取决于条件是什么。

这是我成功后的ajax:

success: function(data, status, jqXHR) {

   $.each(data, function(i, row) {


document.getElementById("hidden_counter").value = "";//new_count value here

   var allRows =window.parent.document.getElementsByClassName('row'+row.action_transaction_id+'');

   for (var i = 0; i < allRows.length; i++) {
       allRows[i].style.backgroundColor = '#008e00';
       allRows[i].style.color = '#f0fff0'; 
       //should exclude the last array when updating the bgcolor and style color of the row   
    }
  });
}

我有两件事要知道和做。

  1. 如何获取最后一个对象?

    "new_count": { "action_count": "4" }

  2. 这样我就可以将隐藏的输入值更新为它。

    1. 如何在更新行样式时排除最后一个对象?

6 个答案:

答案 0 :(得分:2)

你不应该将纯js与jquery混合使用:

success: function(data, status, jqXHR) {

   $('#hidden_counter').val(data.new_count.action_count);

   $.each(data, function(i, row) {

     if (row.action_transaction_id === undefined) {
       return;
     }

     $('.row' + row.action_transaction_id).css({
         backgroundColor: '#008e00',
         color: '#f0fff0'
     });
  });
}

答案 1 :(得分:1)

如果您的对象名称是jsondata,那么访问new_count即可使用,

jsondata.new_count

如果您想访问最后一个元素,则可以通过

访问它
jsondata.new_count.action_count

答案 2 :(得分:1)

  

如何获取最后一个对象?

对象键未排序,并按特定于浏览器的顺序检索。所以你可以尝试做的是获取密钥列表并获取最大值。

如前所述,这应该可以解决问题:

var lastIndex = Math.max.apply(null, Object.keys(object).map(Number))
  

如何在更新行样式时排除最后一个对象?

您可以在length - 1

停止循环

或者您可以尝试使用CSS选择器:

var selector = '.row' + row.action_transaction_id + ':not(:last-child)';
var allRows = window.parent.document.querySelectorAll(selector);

// OR since you are using jQuery

var allRows = $(window).parent().find(selector)

// OR
var selector = '.row' + row.action_transaction_id;
var allRows = $(window).parent().find(selector).not(':last-child')

答案 3 :(得分:0)

第一部分:获取具有最大索引的元素(= length - 1)

第二:循环索引0中的所有元素直到索引&lt;长度为1的

var lastArrayElement = allRows[allRows.length - 1];
var action_count = lastArrayElement.action_count;

// loop all but last element:
for(var i=0; i<allRows.length-1;i++){ 
   do_something(allRows[i]); //custom function
}

假设:

  • 索引是正确的,并且在创建json对象
  • 的过程中没有使用
  • 索引确实是从0到某个整数的范围,没有遗漏任何值

修改

实际上allRows.length不起作用,因为它是一个对象(包含纯数值作为属性)。 Object.keys(allRows)。length将为您提供计数范围属性。但是,它会给你3作为计数中的最后一个文本索引。

var max = 0;
for(i = 0; i < Object.keys(allRows).length;i++) {

    if(parseInt(Object.keys(allRows)[i]) > max) {
        max = Object.keys(allRows)[i];
    }

}

然后是最后一个元素 var lastArrayElement = allRows[max];

答案 4 :(得分:0)

您可以使用Object.keys

success: function(data, status, jqXHR) {
      var lastKey = Object.keys(data)[Object.keys(data).length-1];
      $.each(data, function(i, row) {
           if (i== lastKey) { /* It's the last key */ }
          ...

请注意,对于旧版浏览器,您可能需要使用该链接中包含的polyfill。

答案 5 :(得分:0)

试试这个:

    $.each(data, function(i, row) {
            if(row["action_count"])
            {
                document.getElementById("hidden_counter").value = row["action_count"];
            }
            else
            {
                var allRows =window.parent.document.getElementsByClassName('row'+row.action_transaction_id+'');
                for (var i = 0; i < allRows.length; i++) {
                    allRows[i].style.backgroundColor = '#008e00';
                    allRows[i].style.color = '#f0fff0'; 
                }
            }
        });