2014-09-26 2 views
0

Я пытаюсь собрать уникальные данные json, я имею в виду, если ключ существует, обновите его значение. Но не удалось обновить значение существующего ключа.Обновить значения JSON с помощью связанного ключа

var fpr_data = [{"rfr_id":"7","user_id":"5","fp_id":"10","raw_id":"3","raw_qty":"20.00","raw_wastage":"2","raw_name":"Buttons"}, 
       {"rfr_id":"9","user_id":"5","fp_id":"10","raw_id":"4","raw_qty":"500.00","raw_wastage":"0","raw_name":"Yarn"}, 
       {"rfr_id":"8","user_id":"5","fp_id":"10","raw_id":"5","raw_qty":"2.00","raw_wastage":"1","raw_name":"Needle"}, 
       {"rfr_id":"7","user_id":"5","fp_id":"10","raw_id":"3","raw_qty":"20.00","raw_wastage":"2","raw_name":"Buttons"}]; 

var qty = 2, coll={}, _qty=0.00,_wastage=0.00; 

// Filter and modify JSON data 
$.each(fpr_data, function(i, data) { 
    _qty = data.raw_qty * qty; 
    _wastage = data.raw_wastage * qty; 

    // Next time add on existing keys 
    if(coll[data.raw_id] == data.raw_id) { 
     var q = coll[data.raw_id].qty + _qty; 
     var w = coll[data.raw_id].wastage + _wastage; 

     coll[data.raw_id] = {"qty":q, "wastage":w}; 
    } 
    else { 
     coll[data.raw_id] = {"qty":_qty, "wastage":_wastage}; 
    } 
}); 
console.log(coll); 

В fpr_data есть raw_id, что я хочу, чтобы собрать уникальные идентификаторы, и если raw_id найти в объекте затем обновить его qty и wastage с raw_qty и raw_wastage. Я получил уникальные данные JSON, но количество и потери не получают обновления. Что я сделал? Вы можете найти те же коды в скрипке и проверить результат на консоли.

Ожидаемое: Значение qty в 3 должно быть 80

JSFIDDLE

+0

Обратите внимание, что вы манипулируете не JSON, это массив объектов. (Это только JSON, когда и если он сериализуется в строку.) – nnnnnn

+0

@nnnnnn, спасибо, чтобы указать мне в правильном направлении. Могу ли я манипулировать им в JSON? –

+0

Нет, по крайней мере, не так легко, так как это будет манипулировать строкой. Вы можете манипулировать им напрямую, когда у вас есть массив объектов, как вы. – nnnnnn

ответ

2

Условие ниже не даст вам правильного сравнения, когда объект уже существует в массиве.

если (Coll [data.raw_id] == data.raw_id) {

Я думаю, вы просто должны сделать:

если (Coll [data.raw_id]) {

Если я вас правильно понял попробовать этот example

if(coll[data.raw_id]) { 

      var q = coll[data.raw_id].qty + _qty; 
      var w = coll[data.raw_id].wastage + _wastage; 

      coll[data.raw_id] = {"qty":q, "wastage":w}; 
     } 
     else { 
      coll[data.raw_id] = {"qty":_qty, "wastage":_wastage}; 
     } 
+0

Ahh, правильно. Я пытался сравнить объект с номером. –

0

Вы используете JQuery, поэтому пользоваться функцией jQuery.extend():

var fpr_data = [{"rfr_id":"7","user_id":"5","fp_id":"10","raw_id":"3","raw_qty":"20.00","raw_wastage":"2","raw_name":"Buttons"},{"rfr_id":"9","user_id":"5","fp_id":"10","raw_id":"4","raw_qty":"500.00","raw_wastage":"0","raw_name":"Yarn"},{"rfr_id":"8","user_id":"5","fp_id":"10","raw_id":"5","raw_qty":"2.00","raw_wastage":"1","raw_name":"Needle"}, {"rfr_id":"7","user_id":"5","fp_id":"10","raw_id":"3","raw_qty":"20.00","raw_wastage":"2","raw_name":"Buttons"}]; 
console.log(fpr_data); 
var qty = 2, coll={}, _qty=0.00,_wastage=0.00; 

    // Filter and modify JSON data 
    $.each(fpr_data, function(i, data) { 
     _qty = data.raw_qty * qty; 
     _wastage = data.raw_wastage * qty; 

     // Next time add on existing keys 
     var currentObj = coll[data.raw_id]; // Try not to repeat yourself ;-) 
     if(currentObj == data.raw_id) { 
      var q = currentObj.qty + _qty; 
      var w = currentObj.wastage + _wastage; 
      console.log(data); 
      coll[data.raw_id] = $.extend(data, {"qty":q, "wastage":w}); 
     } 
     else { 
      coll[data.raw_id] = $.extend(data, {"qty":_qty, "wastage":_wastage}); 
     } 
    }); 
console.log(coll); 

I надеюсь, это то, что вы искали.

+0

Спасибо за ответ, но это не то, что я хочу. –

Смежные вопросы