【问题标题】:JS validating a dot notation stringJS 验证点符号字符串
【发布时间】:2018-12-15 17:53:22
【问题描述】:

假设我有一个现有的 Items 数组:

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

// VALID => 期望为真

场景 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

// VALID => 期望为真

场景 5: 当多次包含新路径时

let current = 'yyy.xxx.zzz'; // current existing Item
let newPath = 'xxx.yyy.xxx.zzz'; //new

// VALID => 期望为真

场景 6: 当新路径有一个点时

 let current = 'yyy.xxx.zzz'; // current existing Item
 let newPath = 'yyy.'; //new

// 无效 => 期望为假

【问题讨论】:

    标签: javascript validation


    【解决方案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));
    

    【讨论】:

    • 这很好,但它不包括场景 3。有什么建议吗?
    【解决方案2】:

    也许有一些更好的方法可以实现这一点,但调整上面的答案以支持场景 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];
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      相关资源
      最近更新 更多