您如何将此代码转换为纯函数式 javascript?

时间:2021-05-10 23:46:25

标签: javascript dictionary filter functional-programming

var files = [];
for (const entry of Object.entries(collection)) {
    var folder = "";
    entry.forEach(item => {
        if (typeof item == "string") {
            folder = item;
        }

        if (typeof item == "object") {
            item.forEach(file => {
                files.push(folder + "/" + file); // append files only (recursive)      
            })
        }
        
    });
    // sometimes lists contain names of children directories. check with the top parent to exclude directory names
    files = files.filter(x => !Object.keys(collection).includes(x));
}
console.log(files);

有一个 javascript 对象 collection,它是代表某个目录的键值对的集合。
每个键是一个子目录的名称,它的值是列表类型,特别是仅在该目录内的文件名列表。

此代码有效,它通过一些额外的逻辑和串联从基目录递归获取绝对文件路径名称列表。

我很难重写此代码以纯粹使用 .map()、.filter()、.find()、.pipe() 或 curry 方法

感谢反馈

2 个答案:

答案 0 :(得分:1)

我的回答

var files = Object.entries(collection)
            .map(entries => entries
            .filter(entry => typeof entry == "object")
            .map(files => files
            .map(file => entries[0] + "/" + file))) // first entry will be the folder name to concatenate
            .flat().flat()
            .filter(x => !Object.keys(collection).includes(x));

返回列表和计数正确

答案 1 :(得分:0)

我认为这足以帮助您入门, 我还建议编辑 Q 并为此函数添加 inputoutput 示例...

const join = ([folder, files]) => files.reduce(
  (res, file) => ({...res, [`${folder}/${file}`]: 1 }),
  {},
);

const fn = ([head, ...tail]) => Object
  .assign(join(head), tail.length ? fn(tail) : {});
  
const toUniquePaths = (data) => Object.keys(
  fn(Object.entries(data)),
);

// ====

const data = {
  a: ['a1', 'a2', 'a3', 'a4', 'a5'],
  b: ['b1', 'b2', 'b3', 'b4', 'b5'],
  c: ['c1', 'c2', 'c3', 'c4', 'c5'],
  d: ['d1', 'd2', 'd3', 'd4', 'd5'],
  e: ['e1', 'e2', 'e3', 'e4', 'e5', /* dupes */ 'e5', 'e4'],
};

console.log(
  toUniquePaths(data),
);