2017-07-19 21 views
0

我的服務器(PHP)響應JSON對象像這樣的數據:確定JSON對象的最後元件

{ 

    "0": { 
     "action_id": "80", 
     "action_transaction_id": "5743", 
     "action_matched_email": "[email protected]", 
     "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": "[email protected]", 
     "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" }

,這樣我可以更新我的隱藏輸入值給它。

  1. 如何在更新行的樣式時排除最後一個對象?
+3

這不是一個數組,它是屬性爲'0'和'1'的對象。 –

+2

如果'data'代表上面的對象,並且你想訪問它的屬性'new_count',那你爲什麼不寫'data.new_count'?對象中沒有_last_元素,因爲未定義屬性的排序順序,請參閱:[JavaScript保證對象屬性順序?](https://stackoverflow.com/questions/5525795)以獲取更多詳細信息。 –

+1

假設所有的鍵都是數字的,你可以嘗試'var lastIndex = Math.max.apply(Object.keys(object).map(Number))' – Rajesh

回答

2

你不應該」用jquery混合純js:

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' 
    }); 
    }); 
} 
+0

是使用'data.new_count.action_count'工程。 –

1

如果你的對象的名字是可以說jsondata然後accesing new_count您可以用得到它,

jsondata.new_count 

如果您要訪問最後一個元素,那麼你可以通過訪問它,

jsondata.new_count.action_count 
0

第一件:獲得指數最大的元素(=長度 - 1)

seco ND:循環從索引0的所有元素,直到索引<長度-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,因爲最後的文本索引也被記錄在count中。

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

+1

'index(= length - 1)''''Arrays'和**不** ** Objects' – Rajesh

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 */ } 
      ... 

需要注意的是舊版本瀏覽器,你可能需要使用包含在該鏈接的填充工具。

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') 
+1

它必須是'Math.max.apply(undefined,Object.keys(object).map(Number))',除此之外,這將返回給定情況下的'NaN'因爲Number('new_count')'將導致'NaN' –

+0

@ t.niese真。我總是忘記傳遞語境。謝謝!已更新回答 – Rajesh

+0

但它仍然會返回'NaN',因爲該對象不僅包含數值。 –

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