Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组中的文本转换为对象_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript 数组中的文本转换为对象

Javascript 数组中的文本转换为对象,javascript,ecmascript-6,Javascript,Ecmascript 6,我使用node将数组转换为对象,我有一个数组,如下所示 [ 'items[0].book=Book1', 'items[0].color=Red', 'items[0].bookCode=#1', 'items[1].book=Book2', 'items[1].color=Yellow', 'items[1].bookCode=#2', 'items[2].book=Book3', 'items[2].color=Blue', 'items[2].bookCode=#3', ... ] 我试

我使用node将数组转换为对象,我有一个数组,如下所示

[
'items[0].book=Book1',
'items[0].color=Red',
'items[0].bookCode=#1',
'items[1].book=Book2',
'items[1].color=Yellow',
'items[1].bookCode=#2',
'items[2].book=Book3',
'items[2].color=Blue',
'items[2].bookCode=#3',
...
]
我试图将其转换为一个数组中的对象

items:[
  {
    book: "Book1",
    color: "Red",
    bookCode: "#1"
  },
  {
    book: "Book2",
    color: "Yellow",
    bookCode: "#2"
  },
  ...
]
我发现很容易转换,因为它使用了第三方库,如setKeypath/set

我正在寻找一种方法,如果它可以与es6实现相同的输出,那么我真的不需要库。谢谢

[ 'items[0]。book=Book1', '项目[0]。颜色=红色', '项目[0]。账簿代码=1', 'items[1]。book=Book2', '项目[1]。颜色=黄色', '项目[1]。账簿代码=2', 'items[2]。book=Book3', '项目[2]。颜色=蓝色', '项目[2]。账簿代码=3', ].reduceac,str=>{ 常量索引=Numberstr.slicestr.indexOf'['+1,str.indexOf']'; if!acc[索引]{ acc[索引]={}; } const entry=[str.slicestr.indexOf'.+1,str.indexOf'=',str.slicestr.indexOf'='.+1]; acc[索引][分录[0]]=分录[1]; 返回acc; }, []; 在这里,我根据一致的格式分离给定的字符串,获取索引、键和值,然后使用Arrayreduce将数组放在一起

文件:

[ 'items[0]。book=Book1', '项目[0]。颜色=红色', '项目[0]。账簿代码=1', 'items[1]。book=Book2', '项目[1]。颜色=黄色', '项目[1]。账簿代码=2', 'items[2]。book=Book3', '项目[2]。颜色=蓝色', '项目[2]。账簿代码=3', ].reduceac,str=>{ 常量索引=Numberstr.slicestr.indexOf'['+1,str.indexOf']'; if!acc[索引]{ acc[索引]={}; } const entry=[str.slicestr.indexOf'.+1,str.indexOf'=',str.slicestr.indexOf'='.+1]; acc[索引][分录[0]]=分录[1]; 返回acc; }, []; 在这里,我根据一致的格式分离给定的字符串,获取索引、键和值,然后使用Arrayreduce将数组放在一起

文件:


我想一点点正则表达式就可以了:

常数=[ 'items[0]。book=Book1', '项目[0]。颜色=红色', '项目[0]。账簿代码=1', 'items[1]。book=Book2', '项目[1]。颜色=黄色', '项目[1]。账簿代码=2', 'items[2]。book=Book3', '项目[2]。颜色=蓝色', '项目[2]。账簿代码=3' ] 常量结果=[]; ar.forEachitem=>{ 常量索引=parseIntitem.match/\[[0-9]+\]/[1]; 常量参数=item.split.[1].split=; if!结果[索引] 结果[索引]={} 结果[索引][参数[0]]=参数[1]; }
console.logresult我想一点regex就可以了:

常数=[ 'items[0]。book=Book1', '项目[0]。颜色=红色', '项目[0]。账簿代码=1', 'items[1]。book=Book2', '项目[1]。颜色=黄色', '项目[1]。账簿代码=2', 'items[2]。book=Book3', '项目[2]。颜色=蓝色', '项目[2]。账簿代码=3' ] 常量结果=[]; ar.forEachitem=>{ 常量索引=parseIntitem.match/\[[0-9]+\]/[1]; 常量参数=item.split.[1].split=; if!结果[索引] 结果[索引]={} 结果[索引][参数[0]]=参数[1]; }
logresult您可以首先通过regex查找所有值,然后逐个将属性插入到每个对应的元素中。这种方法适用于数组的顺序和属性,只要每个元素遵循相同的模式

让项目=[ 项目[1]。账簿代码=2, 项目[0]。帐簿=帐簿1, 项目[0]。账簿代码=1, 项目[1]。账簿=账簿2, 项目[2]。账簿代码=3, 项目[1]。颜色=黄色, 项目[2]。账簿=账簿3, 项目[2]。颜色=蓝色, 项目[0]。颜色=红色, 项目[4]。测试=测试! ]; 让indexPattern=/\[\d*\]/; 设attrPattern=/\..*=/; 设valuePattern=/=.*/; 设obj=Object.values items.reduceobj,元素=>{ 让index=element.matchindexPattern[1]; 设attr=element.matchattrPattern[1]; 让value=element.matchvaluePattern[1]; 如果!obj.hasOwnPropertyindex obj[index]={}; obj[索引][属性]=值; 返回obj; }, {} ;
console.logobj 您可以首先按正则表达式查找所有值,然后逐个将属性插入到每个对应的元素中。这种方法适用于数组的顺序和属性,只要每个元素遵循相同的模式

让项目=[ 项目[1]。账簿代码=2, 项目[0]。帐簿=帐簿1, 项目[0]。账簿代码=1, 项目[1]。账簿=账簿2, 项目[2]。账簿代码=3, 项目[1]。颜色=黄色, 项目[2]。账簿=账簿3, 项目[2]。颜色=蓝色, 项目[0]。颜色=红色, 项目[4]。测试=测试! ]; 让indexPattern=/\[\d*\]/; 设attrPattern=/\..*=/; 设valuePattern=/=.*/; 设obj=Object.values items.reduceobj,元素=>{ 让index=element.matchindexPattern[1]; 设attr=element.matchattrPattern[1]; 让value=element.matchvaluePattern[1]; 如果!obj.hasOwnPropertyindex obj[index]={}; obj[索引][属性]=值; 返回obj; }, {} ;
console.logobj;数组的格式是否始终一致?也就是说,每个项目都将有三个值并进行排序?如果是这样的话,一个简单的正则表达式应该始终填充数组项,或者这也会改变吗?例如,g'stuff[0]。book=Bo
ok1’是的,总是项目作为开始,这就是为什么我使用starts时不总是3个值,有时我发现4个值,但通常是3个值@BurningAlcohol你是如何生成这个数组的?如果它来自表单编码的post数据,那么对于所有这些,都有一个更简单的方法。数组的格式是否始终一致?也就是说,每个项目都将有三个值并进行排序?如果是这样的话,一个简单的正则表达式应该始终填充数组项,或者这也会改变吗?例如,g'stuff[0].book=Book1'是的,总是将项目作为开始,这就是为什么我使用starts时不总是3个值,有时我发现4个值,但通常是3个值@BurningAlcohol你是如何生成这个数组的?如果它来自表单编码的post数据,那么对于所有这一切都有一个更简单的方法
const obj = {};
const arr = [items......(like above)]
arr.forEach((val => {
  if (val.startsWith('items[')) {
    const splitWord = item.split('=');
    setKeypath(obj, splitWord[0], splitWord[1]);
  }
});
const items = [
  "items[0].book=Book1",
  "items[0].color=Red",
  "items[0].bookCode=#1",
  "items[1].book=Book2",
  "items[1].color=Yellow",
  "items[1].bookCode=#2",
  "items[2].book=Book3",
  "items[2].color=Blue",
  "items[2].bookCode=#3"
];

let res = [];
let currId = "";
let currItem = null;
for (let i = 0; i < items.length; i++) {
  let parts = items[i].split(".");
  if (currId!==parts[0] && currItem) { //new item
    res.push(currItem)
    currId = parts[0];
  }
  if (!currItem)
    currItem = {};
  let keyValue = parts[1].split("=");
  currItem[keyValue[0]] = keyValue[1]
}
console.log({items: res})