JS数组数组转对象

JS array of arrays to object

我有一个 JS 数组(显示 4 个示例实际有 66 个)

[["A","Example1"],["A","Example2"],["B","Example3"],["B","Example4"]]

我正在尝试进入多 select 下拉菜单的对象:

var opt = [{
label: 'A', children:[
        {"label":"Example1","value":"Example1","selected":"TRUE"},
        {"label":"Example2","value":"Example2","selected":"TRUE"} 
      ]
},

{
label: 'B', children:[
  {"label":"Example3","value":"Example3","selected":"TRUE"},
  {"label":"Example4","value":"Example4","selected":"TRUE"}
  ]
}
]

有没有简单的方法来做到这一点?

更新: 使用 reduce()filter() 获得预期结果。

const result = [['A', 'Example1'], ['A', 'Example2'], ['B', 'Example3'], ['B', 'Example4']].reduce((acc, cur) => {
  const objFromAccumulator = acc.filter((row) => row.label === cur[0]);
  const newChild = {label: cur[1], value: cur[1], selected: 'TRUE'};
  if (objFromAccumulator.length) {
    objFromAccumulator[0].children.push(newChild);
  } else {
    acc.push({label: cur[0], children: [newChild]});
  }
  return acc;
}, []);

console.log(result);

下面是使用对象作为地图来解决问题的一种相当高效和简洁的方法:

const data = [["A","Example1"],["A","Example2"],["B","Example3"],["B","Example4"]];

const opt = data.reduce((results,[key,val]) => {
  if(!results[0][key]) //first element of results is lookup map of other elements
    results.push(results[0][key] = { label: key, children: [] });
  results[0][key].children.push({ label: val, value: val, selected:"TRUE" });
  return results;
}, [{}]).slice(1); //slice off map as it's no longer needed

console.log(opt);

像这样的东西应该可以工作:

const raw = [["A","Example1"],["A","Example2"],["B","Example3"],["B","Example4"]];

const seen = new Map();
const processed = raw.reduce((arr, [key, label]) => {
    if (!seen.has(key)) {
        const item = {
            label: key,
            children: []
        };
        seen.set(key, item);
        arr.push(item);
    }
    seen.get(key).children.push({
        label,
        value: label,
        selected: "TRUE"
    })
    return arr;
}, []);
console.log(processed);