求助:a、b数据如何实现这样的格式化

游龙翔隼
  • 1.3k

先上代码,formatter希望返回组装后的数据

var olda = [
  {
    flight: 'hu7305',
    from: 'lhw',
    to: 'ybp'
  },
  {
    flight: 'hu7306',//new中没有,state=del
    from: 'lhw',
    to: 'ybp'
  },
];
var newa = [
  {
    flight: 'hu7305',//old中有,忽略
    from: 'lhw',
    to: 'ybp'
  },{
    flight: 'hu7777',//old中没有,state=add
    from: 'www',
    to: 'qqq'
  }
];

function formatter(a, b){
    ...
    return ([//希望返回如下的数据
      {
        flight: 'hu7306',//del
        from: 'lhw',
        to: 'ybp',
        state: 'del'
      },{
        flight: 'hu7777',//add
        from: 'www',
        to: 'qqq',
        state: 'add'
      }            
    ])
}
formatter(olda, newa);

规则:单个对象中的flight、from、to三者的值任一不同则视为不同的数据,需要返回;在olda中有而newa中没有时state为del,在olda没有而newa中有则state为add。

回复
阅读 935
2 个回答
✓ 已被采纳
function formatter (a, b) {
  const m = new Map(a.map(x => [x.flight, x]))
  b.forEach(x => m.set(x.flight, m.has(x.flight) ? null : Object.assign({state: 'add'}, x)))
  return Array.from(m.values())
    .filter(x => x)
    .map(x => x.state ? x : Object.assign({state: 'del'}, x))
}
function formatter (a, b) {
  var oldOne = JSON.parse(JSON.stringify(a))
  var newOne = JSON.parse(JSON.stringify(b))
  var oldMap = oldOne.map((item) => JSON.stringify(item))
  var newMap = newOne.map((item) => JSON.stringify(item))
  newMap.forEach((item, index) => {
    const nth = oldMap.indexOf(item)
    if (nth === -1) {
      // 无标记加
      newOne[index].state = 'add'
      oldOne.push(newOne[index])
    } else {
      // 有删
      oldMap.splice(nth, 1)
      oldOne.splice(nth, 1)
    }
  })
  oldMap.forEach((item, index) => {
    // 无标记删
    if (newMap.indexOf(item) === -1) {
      oldOne[index].state = 'del'
    }
  })
  return oldOne
}

应该有更简单的方法

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏