从重复数组中填充数组

3

我正在制作一个小工具来处理网站的翻译。我已经让这段代码工作了,但是我感觉应该有一些更优雅和可读性更好的方法,使用数组方法(我的代码看起来很混乱...)。

基本上,我将以代码中显示的格式(data_import,这只是用于测试的虚假数据)获得输入。它有4列[translationTag,uniqueId,languageId,translation]。每种语言的行顺序相同,并且每种语言的行数相同。语言数量可能从2个以上变化。

期望的输出应该像这样:

const data_import =  [

  ['aaa', {id:1, langId:1, finnish:'tuntematon'}, {id:5, langId:4, english:'unknown'}, {id:9, langId:6, swedish:'okänd'}],
  ['bbb', {id:2, langId:1, finnish:'auto'}, {id:6, langId:4, english:'car'}, {id:10, langId:6, swedish:'bil'}],
  ['ccc', {id:3, langId:1, finnish:'polkupyörä'}, {id:7, langId:4, english:'bicycle'}, {id:11, langId:6, swedish:'cykel'}],
  ['ddd', {id:4, langId:1, finnish:'rullalauta'}, , {id:8, langId:4, english:'skateboard'}, {id:12, langId:6, swedish:'skateboard'}]
];

这是我的代码,它“可行”但很丑陋而难以阅读...
export const language = ['Finnish', 'Estonia', 'Polish', 'English', 'Spanish', 'Swedish'];

const data_import =  [
  ['aaa', 1, 1, 'tuntematon'],
  ['bbb', 2, 1, 'auto'],
  ['ccc', 3, 1, 'polkupyörä'],
  ['ddd', 4, 1, 'rullalauta'],
  ['aaa', 5, 4, 'unknown'],
  ['bbb', 6, 4, 'car'],
  ['ccc', 7, 4, 'bicycle'],
  ['ddd', 8, 4, 'skateboard'],
  ['aaa', 9, 6, 'okänd'],
  ['bbb', 10, 6, 'bil'],
  ['ccc', 11, 6, 'cykel'],
  ['ddd', 12, 6, 'skateboard']];

export const data = process_test(data_import);

function process_test(data) {  
  const numberOfCols = data[0].length;
  const idIndex = numberOfCols - 2;
  const arr_result = []
  let rowMax = 0;
  let rowMaxMulti = 0;
  let langIdLast = 0;
  data.forEach((row, index) => {
    // if = add non-language cols and first language column
    if(row[idIndex] === data[0][idIndex]) {
      rowMax = index + 1;
      const transItem = row.slice(0, idIndex-1);
      transItem.push({ id:row[idIndex], langId:row[idIndex], [language[row[idIndex] - 1]]:row[idIndex + 1] });
      arr_result[index] = transItem;
      langIdLast = row[idIndex];
    }
    // add other languages to datarow
    else {
      const transItem = { id:row[idIndex - 1], langId:row[idIndex], [language[row[idIndex] + 1]]:row[idIndex + 1] };
      if(langIdLast !== row[idIndex]) rowMaxMulti++;
      arr_result[index - rowMax * rowMaxMulti].push(transItem);
      langIdLast = row[idIndex];
    }
  })
  return(arr_result);
}
3个回答

2

reduce成一个以翻译标签为索引的对象,然后获取该对象的值会更简单。在每次迭代中,如果累加器中不存在翻译标签,则创建一个数组。从当前项的langId中识别语言名称,并将新对象push到数组中:

const language = ['Finnish', 'Estonia', 'Polish', 'English', 'Spanish', 'Swedish'];

const data_import =  [
  ['aaa', 1, 1, 'tuntematon'],
  ['bbb', 2, 1, 'auto'],
  ['ccc', 3, 1, 'polkupyörä'],
  ['ddd', 4, 1, 'rullalauta'],
  ['aaa', 5, 4, 'unknown'],
  ['bbb', 6, 4, 'car'],
  ['ccc', 7, 4, 'bicycle'],
  ['ddd', 8, 4, 'skateboard'],
  ['aaa', 9, 6, 'okänd'],
  ['bbb', 10, 6, 'bil'],
  ['ccc', 11, 6, 'cykel'],
  ['ddd', 12, 6, 'skateboard']];

const data = Object.values(data_import.reduce((a, [tTag, id, langId, word]) => {
  if (!a[tTag]) a[tTag] = [tTag];
  const langName = language[langId - 1];
  a[tTag].push({ id, langId, [langName]: word });
  return a;
}, {}));
console.log(data);


1
你可以使用 Array.prototype.reducetag 对数据进行分组,并使用 Object.keys 将其映射到所需的格式。

const language = ['Finnish', 'Estonia', 'Polish', 'English', 'Spanish', 'Swedish'];

const data_import = [['aaa', 1, 1, 'tuntematon'],['bbb', 2, 1, 'auto'],['ccc', 3, 1, 'polkupyörä'],['ddd', 4, 1, 'rullalauta'],['aaa', 5, 4, 'unknown'],['bbb', 6, 4, 'car'],['ccc', 7, 4, 'bicycle'],['ddd', 8, 4, 'skateboard'],['aaa', 9, 6, 'okänd'],['bbb', 10, 6, 'bil'],['ccc', 11, 6, 'cykel'],['ddd', 12, 6, 'skateboard']];

const grouped = data_import.reduce((all, [tag, id, langId, tran]) => {
  
  if (!all.hasOwnProperty(tag)) all[tag] = [];

  all[tag].push({id, langId, [language[langId-1]]: tran});

  return all;

}, {});

const result = Object.keys(grouped).map(tag => [tag, ...grouped[tag]]);

console.log(result);


0

你也可以使用

  1. Array.prototype.map()
  2. Array.prototype.filter()
  3. new Set([])
  4. 解构赋值

const data_import = [["aaa",1,1,"tuntematon"],["aaa",5,4,"unknown"],["aaa",9,6,"okänd"],["bbb",6,4,"car"],["bbb",2,1,"auto"],["bbb",10,6,"bil"],["ccc",11,6,"cykel"],["ccc",7,4,"bicycle"],["ccc",3,1,"polkupyörä"],["ddd",8,4,"skateboard"],["ddd",4,1,"rullalauta"],["ddd",12,6,"skateboard"]],

      language = ['Finnish', 'Estonia', 'Polish', 'English', 'Spanish', 'Swedish'];

const keys =[...new Set(data_import.map(v => v[0]))];

let result = keys.map(key => [key, data_import.filter(v => v[0] == key).map(v => {
    return {
        id: v[1],
        langId: v[2],
        [language[v[2]-1]]: v[3]
    }
})]);

console.log(result)
.as-console-wrapper {max-height: 100% !important;top: 0;}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接