[英]Turning this string into an object
我有这个字符串(称为数据)
||id: ticket/327364|Subject: TestSubject|Due: 2018||--||id: ticket/327366|Subject: TestTwo|Due: 2018|||
我想变成一个可以使用键/值访问的对象。 步骤1是在“-”上分割字符串,然后删除所有“ |” 迹象。 我喜欢这样
var dataArray = [];
data.split("--").forEach(function(x) {
var arr = x.split("|");
arr = arr.filter(function(e) {
return e;
});
dataArray.push(arr);
});
这给了我多维数组
[Array(3), Array(3)]
0: ["id: ticket/327364", "Subject: Beställning av inkoppling", "Due: Ej inställd"]
1: ["id: ticket/327366", "Subject: Beställning av inkoppling", "Due: Ej inställd"]
这就是我遇到的问题,因为我想在“:”上拆分这些数组中的每个数组。 所以Object.Due将给我截止日期,而Object.Subject给我主题等。此外,它并不总是ID,Subject和Due。 有时,条目可能更少或更多。
我已经试过了
var result = {};
dataArray.forEach(function(x) {
x.forEach(function(y) {
var newArr = y.split(":");
newArr[1] && (result[newArr[0]] = newArr[1]);
});
});
这给了我我想要的东西,给了我这样的对象。
{id: " ticket/327366", Subject: " TestTwo", Due: " 2018"}
但是,结果仅包含来自最后一个数组的数据。 就像它覆盖了第一个一样。 有关如何重新执行此操作的任何建议? 另外,感觉到很多循环,但是我只是花一两天时间来研究JS,所以我还没有真正想出另一种方法。
在第二个代码块中,您仅构建一个对象:您需要一个数组,但result
不是数组。 在外部循环中移动该对象声明,并在每次迭代结束时将该对象推入最终数组。 请参阅您在代码中进行了更改的注释:
var data = '||id: ticket/327364|Subject: TestSubject|Due: 2018||--||id: ticket/327366|Subject: TestTwo|Due: 2018|||'; var dataArray = []; data.split("--").forEach(function(x) { var arr = x.split("|"); arr = arr.filter(function(e) { return e; }); dataArray.push(arr); }); var resultArray = []; // <--- final array dataArray.forEach(function(x) { var result = {}; // <--- one object per iteration x.forEach(function(y) { var newArr = y.split(":"); newArr[1] && (result[newArr[0]] = newArr[1]); }); resultArray.push(result); // <--- push it }); console.log(resultArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }
这是一种替代方法,它使用了几种ES6功能,例如扩展语法,箭头函数, Object.assign
和计算属性语法:
const data = '||id: ticket/327364|Subject: TestSubject|Due: 2018||--||id: ticket/327366|Subject: TestTwo|Due: 2018|||'; const dataArray = data.split("--").map(x => Object.assign(... x.split("|") .filter(e => e) .map(s => s.split(':')) .map(([key, value]) => ({ [key]: value.trim() })) ) ); console.log(dataArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }
好吧,据我所知,这是因为您每次都在result变量中创建一个对象,因此您每次都在循环中覆盖结果。 我认为您可以将结果对象插入结果数组中,并使用.push()将结果对象遍历循环的每个循环。
不知道这对您是否有意义。
这是避免不必要的引用的另一种方法:
const input = '||id: ticket/327364|Subject: TestSubject|Due: 2018||--||id: ticket/327366|Subject: TestTwo|Due: 2018|||'; const result = input .split('--') .map(subArray => { const resultObject = {}; const filtered = subArray .split('|') .filter(item => item.length > 0); for (let element of filtered) { const [key, value] = element.split(':'); resultObject[key] = value.trim(); } return resultObject; }); console.log(result);
在您的版本中,您正在将各个键的值设置为新值,因为对象具有重复的键,所以它们将被最新的键覆盖。
您希望每个dataArray
条目一个结果,而不是一个整体。 因此,将创建的对象放在正确的位置,并将它们收集在一个数组中:
var results = dataArray.map(function(x) {
var result = {};
for (var y of x) {
var newArr = y.split(":");
if (newArr[1]) result[newArr[0]] = newArr[1];
}
return result;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.