数据转换

77 阅读1分钟

数据转换

方案一

// 计算数据变化的函数
  const calculateChanges = (before: DataItem[], after: DataItem[]) => {
    const result: DataItem[] = [];

    // 找出更新和保持不变的记录
    before.forEach(beforeItem => {
      const afterItem = after.find(item => item.id === beforeItem.id);
      if (!afterItem) {
        // 在after中找不到,说明被删除了
        result.push({ ...beforeItem, changeType: 'delete' });
      } else if (JSON.stringify(beforeItem) !== JSON.stringify(afterItem)) {
        // 数据有变化
        result.push({ ...afterItem, changeType: 'update' });
      } else {
        // 数据没变化
        result.push(beforeItem);
      }
    });

    // 找出新增的记录
    after.forEach(afterItem => {
      if (!before.find(item => item.id === afterItem.id)) {
        result.push({ ...afterItem, changeType: 'add' });
      }
    });

    return _.groupBy(result.filter(item => item.changeType), 'changeType');
  }

方案二(优化)

const calculateChanges = (before: DataItem[], after: DataItem[]) => {
  const result: DataItem[] = [];

  // 找出更新和保持不变的记录
  before.forEach(beforeItem => {
    const afterItem = after.find(item => item.id === beforeItem.id);
    if (!afterItem) {
      // 在after中找不到,说明被删除了
      result.push({ ...beforeItem, changeType: 'delete' });
    } else if (!_.isEqual(beforeItem, afterItem)) {
      // 数据有变化
      result.push({ ...afterItem, changeType: 'update' });
    } else {
      // 数据没变化
      result.push(beforeItem);
    }
  });

  // 找出新增的记录
  after.forEach(afterItem => {
    if (!before.find(item => item.id === afterItem.id)) {
      result.push({ ...afterItem, changeType: 'add' });
    }
  });

  return _.groupBy(result.filter(item => item.changeType), 'changeType');
};