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

有如下一个数组 

  [

    {"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的,期望不要这样。


慕尼黑8549860
浏览 450回答 1
1回答

慕桂英3389331

试了一下仿“纯函数式”的代码:两两相配(这是答主想要的效果):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), []    )  ), [])}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript