JS验证点符号字符串

时间:2018-12-15 17:53:22

标签: javascript validation

假设我有一个现有的商品数组:

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

//无效=>期望为假

2 个答案:

答案 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];
            }
        }
    }