H5W3
当前位置:H5W3 > 问答 > 正文

我想把两个json合并在一起

我想得到一个这样的json

[
{'id':1,'array1':2,'array2':3,'array3':4},
{'id':2,'array1':3,'array2':4},
{'id':3,'array1':4,'array2':5,'array3':6,'array4':7,'array5':8}
]

根据通过两个不同json下的id关联在一起。
jsonA:

[{'id':1},{'id':2},{'id':3}]

jsonB:

 [
{'id':1,'array':[2,3,4]},
{'id':2,'array':[3,4]},
{'id':3,'array':[5,6,7,8]}
]

我该怎么实现呢?

回答

const a = [{ id: 1 }, { id: 2 }, { id: 3 }];
const b = [
  { id: 1, array: [2, 3, 4] },
  { id: 2, array: [3, 4] },
  { id: 3, array: [5, 6, 7, 8] }
]


function Combiner(target, data) {
  return target.reduce((pre, cur) => {
    // find
    const matchData = data.find(i => i.id === cur.id)
    // generate array${index}
    const generator = (arr = []) => {
      return arr.reduce((pre, cur, index) => {
        return {
          ...pre,
          [`array${index + 1}`] : arr[index]
        }
      }, {})
    }
    // fill min to max
    const justifyScope = (start, arr) => {
      let gap = arr[0] - start
      if (gap <= 1) {
        return arr
      }
      while(gap > 1) {
        arr.unshift(arr[0] - 1)
        gap--
      }
      return arr
    }
    const newData = matchData ? {
      ...cur,
      ...generator(justifyScope(cur.id, [...matchData.array.sort()]))
    } : cur
    return [
      ...pre,
      newData
    ]
  }, [])
}
console.log(Combiner(a, b))

代码实现:

function getResult(l1, l2) {
    const map = l2.reduce((r, i) => (r[i.id] = i.array, r), {})
    return l1.map(({ id }) => map[id].reduce((r, i, idx) => (r[`array${idx+1}`] = i, r), { id }))
}

测试:

const listA = [{'id':1},{'id':2},{'id':3}]
const listB = [
  {'id':1,'array':[2,3,4]},
  {'id':2,'array':[3,4]},
  {'id':3,'array':[5,6,7,8]}
]

const result = getResult(listA, listB)
console.log(JSON.stringify(result, null, 2))

结果:

[
  {
    "id": 1,
    "array1": 2,
    "array2": 3,
    "array3": 4
  },
  {
    "id": 2,
    "array1": 3,
    "array2": 4
  },
  {
    "id": 3,
    "array1": 5,
    "array2": 6,
    "array3": 7,
    "array4": 8
  }
]

本文地址:H5W3 » 我想把两个json合并在一起

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址