var myObject = {
word1: {
a: ['1.json', '2.json']
b: ['3.json', '4.json', '5.json']
},
word2: {
x: ['1.json', '3.json'],
y: ['2.json', '4.json'],
z: ['5.json']
}
}因此,这个脚本的输出应该是:
['1.json', '4.json', '5.json']这是逻辑,我希望能够获得使用min的文件。以"1.json“为例,它显示在:
myObject.word1.a
但也是如此
myObejct.word2.x
这意味着'1.json‘将不再被使用。但将被添加到输出中。
到目前为止的
输出: 1.json
这是棘手的部分。
现在让我们来看“2.json”。因为'myObject.word1.a‘已经被'1.json’使用了,所以不能使用它,所以跳过它。
到目前为止的
输出: 1.json
现在让我们转到'3.json',它出现在myobject.word1.b上,它出现在myObject.word2.x //上,但1.json已经填补了这个职位。
所以不能用
到目前为止的
输出: 1.json
让我们转到4.json,它出现在myobject.word1.b上,出现在myobject.word2.y <-这里,请记住,我们跳过了'2.json‘,因为它没有工作。所以“4.json”被接受了
到目前为止的
输出: 1.json,4.json
让我们转到5.json,它出现在myobject.word1.b上,也出现在myobject.word2.z上。
这可以使用,因为"z“键没有被任何其他文件使用。
发布于 2021-03-18 23:22:09
让我们将word和letter的组合命名为"dir",将数组元素命名为"files"。
在迭代每个dir时,可以将它们保存在Set (Dir)中。在每个dir中,您可以循环其文件并更新保存该文件的Map (fileDirsMap)。
在这一步之后,您将拥有一个set的dir,以及每个文件的map和它的dir:
dirs: [ "word1.a", "word1.b", "word2.x", "word2.y", "word2.z" ]fileDirsMap: [
[ "1.json", [ "word1.a", "word2.x" ] ],
[ "2.json", [ "word1.a", "word2.y" ] ],
[ "3.json", [ "word1.b", "word2.x" ] ],
[ "4.json", [ "word1.b", "word2.y" ] ],
[ "5.json", [ "word1.b", "word2.z" ] ]
]现在,您可以在fileDirsMap的entries上进行迭代(Array#reduce在这里是合适的)。在每次迭代中,检查这个文件是否有其所有的dirs“未取”,如果是,将文件添加到结果数组(acc)中,并从集合(dirs)中删除其所有and (将其设置为已取)。
const myObject = {
word1: {
a: ['1.json', '2.json'],
b: ['3.json', '4.json', '5.json']
},
word2: {
x: ['1.json', '3.json'],
y: ['2.json', '4.json'],
z: ['5.json']
}
};
const fileDirsMap = new Map();
const dirs = new Set();
Object.entries(myObject).forEach(([word, letters]) => {
Object.entries(letters).forEach(([letter, files]) => {
const dir = `${word}.${letter}`;
dirs.add(dir);
files.forEach(file =>
fileDirsMap.set(file, [...(fileDirsMap.get(file) || []), dir])
);
});
});
const res = [...fileDirsMap.entries()].reduce((acc,[file, fileDirs]) => {
const allDirsNotTaken = fileDirs.every(fileDir => dirs.has(fileDir));
if(allDirsNotTaken) {
acc.push(file);
fileDirs.forEach(fileDir => dirs.delete(fileDir));
}
return acc;
}, []);
console.log(res);
https://stackoverflow.com/questions/66699957
复制相似问题