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

问题描述

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

[
    "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"
  }
}