我得到了一个解析到这个数组的git输出字符串,它给出了package.json文件中所有更改的依赖项:
const data = [
[ '-', '@date-io/moment', '1.3.13', '1', '3', '13' ],
[ '+', '@date-io/moment', '1.3.14', '1', '3', '14' ],
[ '-', '@emotion/react', '11.7.0', '11', '7', '0' ],
[ '-', '@emotion/styled', '11.6.0', '11', '6', '0' ],
[ '+', '@emotion/react', '11.8.2', '11', '8', '2' ],
[ '+', '@emotion/styled', '11.8.1', '11', '8', '1' ]
]
第一个元素(+
/ -
)显示是否添加或删除了此更改。第二个元素是包名(这是连接两个数组的元素),下一个字段给出版本。现在,我需要迭代这个数组,以了解对每个包进行了哪种版本更改。因此,产出应该是:
{
'@date-io/moment': 'patch',
'@emotion/react': 'minor',
'@emotion/styled': 'minor'
}
我试着通过
const result = {}
data.forEach(d => {
result[d[1]] = bump // how to calculate `bump`?
})
但这并不能处理+
和-
,也不计算版本凸点的类型。
发布于 2022-04-24 19:08:00
使用Array.prototype.reduce
来减少您可以将数组缩减为一个对象,对于每个包,使用Array.prototype.find
查找相应的更改。然后,您可以比较版本并确定其更改。
const data = [
[ '-', '@date-io/moment', '1.3.13', '1', '3', '13' ],
[ '+', '@date-io/moment', '1.3.14', '1', '3', '14' ],
[ '-', '@emotion/react', '11.7.0', '11', '7', '0' ],
[ '-', '@emotion/styled', '11.6.0', '11', '6', '0' ],
[ '+', '@emotion/react', '11.8.2', '11', '8', '2' ],
[ '+', '@emotion/styled', '11.8.1', '11', '8', '1' ]
];
const changes = data.reduce((t, [type, name, , major, minor, patch], i, arr) => {
if (type === "+") {
const match = arr
.find(([type, pName]) => type === "-" && pName === name);
if (!match) {
return t; // handle no match here
}
const [, , , pMajor, pMinor, pPatch] = match;
return {
...t,
[name]: pMajor !== major ? "major" :
pMinor !== minor ? "minor" :
"patch"
}
}
return t;
}, {});
console.log(changes);
发布于 2022-04-24 19:26:31
subtractions
Map
,并使用映射将其还原为所需的对象。
const data = [
["-", "@date-io/moment", "1.3.13", "1", "3", "13"],
["+", "@date-io/moment", "1.3.14", "1", "3", "14"],
["-", "@emotion/react", "11.7.0", "11", "7", "0"],
["-", "@emotion/styled", "11.6.0", "11", "6", "0"],
["+", "@emotion/react", "11.8.2", "11", "8", "2"],
["+", "@emotion/styled", "11.8.1", "11", "8", "1"],
];
const subMap = new Map(data.filter((d) => d[0] === "-").map((d) => [d[1], d]));
const additions = data.filter((d) => d[0] === "+");
const updates = additions.reduce((updates, addition) => {
const pkgName = addition[1];
const [maj, min, patch] = addition.slice(-3);
const [oldMaj, oldMin, oldPatch] = subMap.get(pkgName).slice(-3);
if (maj === oldMaj && min === oldMin && patch >= oldPatch) {
updates[pkgName] = "patch";
} else if (maj === oldMaj && min >= oldMin) {
updates[pkgName] = "minor";
} else {
updates[pkgName] = "major";
}
return updates;
}, {});
console.log(updates);
https://stackoverflow.com/questions/71991432
复制相似问题