الفرق في كائنات JSON باستخدام جافا سكريبت / مسج

StackOverflow https://stackoverflow.com/questions/1200562

  •  05-07-2019
  •  | 
  •  

سؤال

ولدي كائنين JSON في جافا سكريبت، متطابقة باستثناء القيم العددية. يبدو مثل هذا:

var data = {
  "eth0":{"Tx":"4136675","Rx":"13232319"},
  "eth1":{"Tx":"4","Rx":"0"},
  "lo":{"Tx":"471290","Rx":"471290"}
}

var old = {
  "eth0":{"Tx":"4136575","Rx":"13232219"},
  "eth1":{"Tx":"4","Rx":"0"},
  "lo":{"Tx":"471290","Rx":"471290"}
}

وجوه واحدة تسمى "بيانات" لديه القيم الحالية، وجوه أخرى تسمى "القديمة" لديه نفس القيم من قبل 1 ثانية. أود أن إخراج كائن JSON فقط مع تغيير في القيم حتى أتمكن من حساب سرعة نقل البيانات على واجهات شبكة الاتصال.

var throughput = {
  "eth0":{"Tx":"100","Rx":"100"},
  "eth1":{"Tx":"0","Rx":"0"},
  "lo":{"Tx":"0","Rx":"0"}
}

ولست متأكدا من كيفية التوجه نحو عبور البيانات JSON - يمكن أن يكون لأي عدد من واجهات

.

ويمكن لأي شخص يرجى تقرض لي يد؟ شكرا مقدما

هل كانت مفيدة؟

المحلول

ويمكنك تكرار خلال الأم والطفل كائن خصائص:

var diff = {};
for(var p in data){
  if (old.hasOwnProperty(p) && typeof(data[p]) == 'object'){
    diff[p] = {};
    for(var i in data[p]){
      if (old[p].hasOwnProperty(i)){
        diff[p][i] = data[p][i] - old[p][i];
      }
    }
  }
}

نصائح أخرى

والفرضية الأساسية لبالتكرار عبر الكائنات في جافا سكريبت مثل ذلك

var whatever = {}; // object to iterate over
for ( var i in whatever )
{
  if ( whatever.hasOwnProperty( i ) )
  {
     // i is the property/key name
     // whatever[i] is the value at that property
  }
}

وسوف إصلاح حتى المدقق لن يكون صعبا للغاية. ستحتاج العودية. سأترك ذلك باعتباره ممارسة لك أو سوير آخر.

وربما انها أجبت بما فيه الكفاية، ولكن اسمحوا لي أن أضيف بلدي المكونات وقح :) A JSON (في الواقع أي كائن جافا سكريبت أو بنية مجموعة) مكتبة فرق والتصحيح I مصدر مفتوح في جيثب:

https://github.com/benjamine/jsondiffpatch

وأنه يولد بيانات الاختلاف (كما في شكل JSON، ومع بصمة صغيرة)، والتي يمكنك استخدامها العميل (راجع صفحة الاختبار) وجانب الخادم، وإذا كان موجودا، فإنه يستخدم <لأ href = "HTTP: // كود .google.com / ع / جوجل-فرق مباراة التصحيح / "يختلط =" noreferrer "> http://code.google.com/p/google-diff-match-patch/ للحصول على سلاسل طويلة تلقائيا .

DEMO الصفحة لنرى كيف يعمل.

وهذا لا حيلة لي عند التعامل مع مشكلة مماثلة. فإنه يحصل على الاختلافات في المرتبة الثانية مقارنة مع الأولى.

var first  = originalObj;
var second = modifiedObj;
var diff   = {};

var differ = function(first, second, result) {
    var i = 0;
    for (i in first) {
        if (typeof first[i] == "object" && typeof second[i] == "object") {
            result[i] = differ(first[i], second[i], {});
            if (!result[i]) delete result[i];
        } else if (first[i] != second[i]) {
            result[i] = second[i];
        }
    }
    return isEmpty(result) ? undefined : result;
}

differ(old_conf, new_conf, diff);

والقانون هو جزء من حالة خاصة، ولكن يمكنك الحصول على فكرة عامة: P

ويمكنك استخدام وحدة اجتياز كائن مثل nervgh/object-traverse للقيام بذلك.

var result = {}
Object.traverse(old, function(node, value, key, path) {
  var resultObject = result
  for(var n=0; n<path.length-1; n++) {
    resultObject = resultObject[path[n]]
  }
  resultObject[key] = value
});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top