题目
// 3. 由文件依赖关系输出加载排序
function sortDeps(fileMaps) {
}
sortDeps({ 'index.js': ['1.js', '2.js'], '2.js': ['1.js']});
// output: [ '1.js', '2.js', 'index.js' ]
// index.js 依赖 1.js 2.js
// 2.js 依赖 1.js
// 因此正确的加载顺序是 1.js 2.js index.js
题解
function sortDeps(fileMaps) {
return Object.keys(fileMaps).reduce((result,itemKey) => {
const itemDeps = fileMaps[itemKey]
// 看看结果列表中有没有当前的文件
// 如果有 要将当前文件的依赖插入当前文件前面
// 如果没有 直接依次放入当前文件的依赖、当前文件
let itemIndex = result.findIndex((item) => item = itemKey)
if(itemIndex !== -1){
itemDeps.map(itemDep => {
// 后来的依赖可能已经存在了,需要去重
if(!result.includes(itemDep)){
result.splice(itemIndex,0,itemDep)
itemIndex++
}
})
}else{
result.push(...itemDeps,itemKey)
}
return result
},[])
}
console.log(sortDeps({ 'index.js': ['1.js', '2.js'], '2.js': ['1.js']}))
console.log(sortDeps({ 'index.js': ['1.js', '2.js'], '2.js': ['1.js'],'1.js':['3.js','4.js']}))
// output: [ '1.js', '2.js', 'index.js' ]
// index.js 依赖 1.js 2.js
// 2.js 依赖 1.js
// 因此正确的加载顺序是 1.js 2.js index.js
”被依赖的一定是放前面的,所以会是1,2,index,1,2 然后针对这个从后往前去重,前面有的就把后面的删了
或者说,先把第一个拿出来1,2,index,然后从后面每一个的被依赖、依赖这样的顺序去取,取到了看看有没有,没有的话就插入到依赖的前面去,有的话就不放了“