繁体   English   中英

将此字符串转换为对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM