微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法用对象到对象的语法来转换字符串?

如何解决有没有办法用对象到对象的语法来转换字符串?

给定的函数给了我以下反馈:

[
    "users[0].name is invalid","date is invalid","address.ZIP is invalid"
]

如何使用对象语法获取输出并将其转换为类似的内容

{
     users: [{name: 'is invalid'}],date: 'is invalid',address: {
        ZIP: 'is invalid'
    }
}

解决方法

您可以将字符串拆分为地址部分和值并获得正确的结构并分配值。

const
    setValue = (object,address,value) => {
        const
            hasBrackets = s => /^\[.+\]$/.test(s),path = address.split(/\.|(?=\[)/),types = path.map((_,i,a) => hasBrackets(a[i + 1]) ? [] : {}),keys = path.map(s => hasBrackets(s) ? s.slice(1,-1) : s),last = keys.pop();

        keys.reduce((r,k,i) => r[k] ??= types[i],object)[last] = value;
    },data = ["users[0].name is invalid","date is invalid","address.ZIP is invalid"],result = data.reduce((r,s) => {
        const [k,v] = s.match(/[^\s]+|.+$/g);
        setValue(r,v.slice(1)) ;
        return r;
    },{});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

,

您可以通过首先确定键,然后迭代键/值对并将它们减少到结果对象来递归减少键。

const main = () => {
  const data = [
    "users[0].name is invalid","users[0].address is invalid","users[1].title is invalid","address.ZIP is invalid"
  ];

  console.log(apply(data));
};

const apply = (data) =>
  data.reduce((result,val,index) => {
    const
      pos = val.indexOf(' '),key = val.substring(0,pos),value = val.substring(pos + 1);
    applyPair(result,key,value);
    return result;
  },{});

const applyPair = (ref,value) => {
  const [headKey,...tailKeys] = key.split(/\./);
  if (headKey.endsWith(']')) {
    const [ arrKey,arrIndex ] = parseArrayKey(headKey);
    ref[arrKey] = ref[arrKey] || [];
    const obj = ref[arrKey][arrIndex] || {};
    applyPair(obj,tailKeys.join('.'),value);
    ref[arrKey][arrIndex] = obj;
  } else {
    if (tailKeys.length > 0) {
      const objKey = headKey;
      ref[objKey] = {};
      applyPair(ref[objKey],value);
    } else {
      ref[key] = value;
    }
  }
};

const parseArrayKey = (key) =>
  (([m,i]) => [k,parseInt(i,10)])(key.match(/^(\w+)\[(\d+)\]$/));

main();
.as-console-wrapper { top: 0; max-height: 100% !important; }

结果

{
  "users": [
    {
      "name": "is invalid","address": "is invalid"
    },{
      "title": "is invalid"
    }
  ],"date": "is invalid","address": {
    "ZIP": "is invalid"
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。