为了账号安全,请及时绑定邮箱和手机立即绑定

一个JS的算法,求大神解答

一个JS的算法,求大神解答

慕尼黑8549860 2018-11-23 18:14:57
有如下一个数组   [    {"id": 100006, "value": "40,1666"},    {"id": 100017, "value": "112,113"},  ]期望输出如下结果  ['10006:40,100017:112',   '10006:40,100017:113',   '10006:1666,100017:112',   '10006:1666,100017:113',  ]    亦或者输入三个或者N个数组[  {"id": 100006, "value": "40,1666"},  {"id": 100017, "value": "112,113"},  {"id": 100018, "value": "1,2"},]能够输出['10006:40,100017:112', '10006:40,100017:113', '10006:40,100018:1', '10006:40,100018:2', '10006:1666,100017:112', '10006:1666,100017:113', '10006:1666,100018:1', '10006:1666,100018:2', '100017:112,100018:1', '100017:112,100018:2', '100017:113,100018:1', '100017:113,100018:2',]请问怎么实现这个函数?附加:最好不论输入数组长度都能正确的输出相应的值(是所有数组的里的值都会被匹配一次),有些答案是固定取值0,1的,期望不要这样。
查看完整描述

1 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

试了一下仿“纯函数式”的代码:

两两相配(这是答主想要的效果):

function transform(list) {

  return list.map(i =>

    i.value

    .split(',')

    .map(j => `${i.id}:${j}`)

  ).reduce((acc, current, i, arr) => {

    current.forEach(L => {

      arr

      .filter((_, k) => k > i)

      .forEach(j => {

        j.forEach(R => {

          acc.push(`${L},${R}`)

        })

      })

    })

    return acc

  }, [])

}

另外,附加上NN相配(笛卡儿积):

function transform(list) {

  return list.map(i =>

    i.value

    .split(',')

    .map(j => `${i.id}:${j}`)

  ).reduce((l, r) => (

    l.length === 0 ?

    r :

    l.map(g =>

      r.map(j =>

        `${g},${j}`

      )

    )

    .reduce((l, r) =>

      l.concat(r), []

    )

  ), [])

}


查看完整回答
反对 回复 2018-12-27
  • 1 回答
  • 0 关注
  • 449 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信