Как использовать Reduce для поиска элемента и построения объекта массива? - PullRequest
0 голосов
/ 01 октября 2019

Пытаясь написать логику, если путь к объекту одинаков, необходимо создать один объект в массиве с name разделенными запятыми. Как использовать Reduce для достижения этой задачи?

main.js

 var data = [
{id: "param", name: "IGetRefillMultiPlanParam", path: "@combinator-interfaces/dist/drug/GetRefills/GetRefills.Model.ts"}
{id: "details", name: "IRefills", path: "@combinator-interfaces/dist/drug/GetRefills/GetRefills.Model.ts"}
{id: "header", name: "IHeader", path: "@combinator-interfaces/dist/common/Header.Model.ts"}
]

    function buildInterface (data) {
           var interfaceArray = [];
           data.reduce(function(acc,arr){
            var filePath = acc.path.replace('.ts','');
            var imports  = data.map(d => d.name).join(', '); 
                if(acc.path.includes(arr.path)) {
                interfaceArray.push(`import { ${imports} } from '${filePath}';\n\n`);
                }
            });

            return interfaceArray;

       }

Ожидаемый результат

[
    'import { IGetRefillMultiPlanParam, IRefills} from "@combinator-interfaces/dist/drug/GetRefills/GetRefills.Model"',
    'import { IHeader } from "@combinator-interfaces/dist/common/Header.Model"'
]

1 Ответ

1 голос
/ 01 октября 2019

Вы использовали reduce неправильно. Посмотрите на это, и если у вас есть какие-либо вопросы, задайте.

const data = [
  {
    id: "param",
    name: "IGetRefillMultiPlanParam", 
    path: "@combinator-interfaces/dist/drug/GetRefills/GetRefills.Model.ts"
  },
  {
    id: "details",
    name: "IRefills", 
    path: "@combinator-interfaces/dist/drug/GetRefills/GetRefills.Model.ts"
  },
  {
    id: "header",
    name: "IHeader", 
    path: "@combinator-interfaces/dist/common/Header.Model.ts"
  },
];

function buildInterface (data) {
  const parsed = data.reduce((map, importing) => {
    if (!map[importing.path]) {
      map[importing.path] = [];
    }
    const list = map[importing.path];
    
    list.push(importing.name);
    
    return map;
  }, {});
  console.log('parsed', parsed);
  
  return Object.entries(parsed).map(([importPath, toImport]) => {
    return `import { ${toImport.join(', ')} } from '${importPath.replace('.ts','')}'`;
  });
}
console.log(buildInterface(data));
...