假设我有一个现有的商品数组:
const existingItems = [
{
"path": "xxx.yyy.zzz"
},
{
"path": "yyy.xxx.zzz"
}
];
比用户将新元素添加到此数组-例如:
const newItem = {
"path": "yyy.xxx"
};
如何验证newItem.path是否与任何绝对路径都不匹配?
我尝试了几种方法,但是每次都使用不同的if语句,这会使它变得很脏。有什么不错的魔术功能可以实现以下方案?
例如:
方案1: 当新路径是现有路径的一部分时
let current = 'yyy.xxx.zzz'; // current existing Item
let newPath = 'yyy.xxx'; //new
//无效=>期望为假
方案2: 当新路径包含在现有路径的一部分中
let current = 'yyy.xxx.zzz'; // current existing Item
let newPath = 'yyy.xxx.z'; //new
//有效=>期望为真
方案3: 当新路径包含现有路径时
let current = 'yyy.xxx.zzz'; // current existing Item
let newPath = 'yyy.xxx.zzz.ggg '; //new
//无效=>期望为假
方案4: 当新路径包含在现有路径的一部分中
let current = 'yyy.xxx.zzz'; // current existing Item
let newPath = 'yy'; //new
//有效=>期望为真
方案5: 不只一次包含新路径
let current = 'yyy.xxx.zzz'; // current existing Item
let newPath = 'xxx.yyy.xxx.zzz'; //new
//有效=>期望为真
场景6: 新路径上有点
let current = 'yyy.xxx.zzz'; // current existing Item
let newPath = 'yyy.'; //new
//无效=>期望为假
答案 0 :(得分:1)
您可以使用.split
来获取子路径,然后对它们进行比较:
const isValid = parts => parts.every(e => e.length);
const matches = (parts, other) => parts.every((part, i) => part === other[i]);
const parts = newItem.path.split(".");
const existing = existingItems.map(item => item.path.split(".");
const result = isValid(parts) && existing.every(e => !matches(parts, e));
答案 1 :(得分:0)
也许有一些更好的方法可以做到这一点,但是修改上面的答案以支持方案3看起来是这样的:(欢迎提出任何建议)
for(let item of existingItems) {
const oldparts = (item.path).split(".");
if(parts.length > oldparts.length) {
let delta = parts.length - oldparts.length;
for(let i=1;i<=delta;i++) {
item.path += '.'+parts[oldparts.length+i-1];
}
}
}