如何解决有没有办法用对象到对象的语法来转换字符串?
给定的函数给了我以下反馈:
[
"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 举报,一经查实,本站将立刻删除。