q150509-2

by jun68ykt

HTML

<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

JavaScript

// 更新前のオブジェクト
const objectA = {
  id: 1,
  description: "製品Aです。",
  images: [
    "1.jpg",
    "2.jpg",
    "3.jpg",
  ],
  metadata: {
    product_id: 6735,
    options: [
      "color",
      "size",
    ]
  },
  name: "製品A",
  active: false,
  created: 1511420673,
  updated: 1528145536,
};

// 更新後のオブジェクト
const objectB = {
  id: 1,
  description: "製品Bになりました。",
  images: [
    "5.jpg",
  ],
  metadata: {
    product_id: 6735,
    options: [
      "size",
    ]
  },
  name: "製品B",
  active: true,
  created: 1511420673,
  updated: 1528145599,
};

// 更新されたプロパティの配列を得る。(https://stackoverflow.com/a/31686152)
const diffProps = _.reduce(objectA, function(result, value, key) {
    return _.isEqual(value, objectB[key]) ?
        result : result.concat(key);
}, []);

console.log(diffProps);

// 値が更新されたプロパティと、それらのobjectBでの値を持つオブジェクトを作成
const diffObj = diffProps.reduce((obj, prop) => { 
  obj[prop] = objectB[prop];
  return obj;
}, {});

console.log(diffObj);