我有一个需要展平的对象。下面的代码段是一个示例:
var raw = {
"Result[0].Row[0].GUID": "sdfsdfsd",
"Result[1].True": true,
"Result[1].Row[0].Name": "Item 1 name",
"Result[1].Row[0].Type": "3",
"Result[1].Row[0].Active": false,
"Result[1].Row[1].Name": "Item 2 name",
"Result[1].Row[1].Type": "7b",
"Result[1].Row[1].Active": true,
"Result[1].Row[2].Name": "Item 3 name",
"Result[1].Row[2].Type": "qr8",
"Result[1].Row[2].Active": true,
"Result[2].Row[0].Desc": "yaddayaddayadda"
}
我正在尝试清理格式,我只想处理任何以Result[1].Row
开头的内容。隔离该小节后,我便想遍历行,所以类似...
var i = 0,
goodRows = [];
for (var row in "Result[1].Row Object") {
var cleanObj = {
name: row[i].Name,
type: row[i].Type,
active: row[i].Active
}
goodRows.push(cleanObj)
i++;
}
我遇到的问题是,我什至无法提出一个笨拙的解决方案,更不用说一个干净的解决方案了。我绝对愿意使用一些第三方库,例如lodash,下划线或带有NPM的任何东西。
答案 0 :(得分:0)
首先将对象转换为列表
Object.entries(raw)
然后过滤谓词
const isFirstRow = ([key, value]) => key.startsWith('Result[0].Row')
然后在您的函数上映射
Object.entries(raw)
.filter(isFirstRow)
.map(processRow)
答案 1 :(得分:-1)
在您的问题中,您只要求文本中的Result [0],但是在示例代码中寻找Result [1]。我认为后者是正确的索引。
在此示例中,我们使用正则表达式来解析raw的属性,取出Row索引和属性名称,并使用解析后的值创建干净的对象。
const goodRows= [];
const regex = /Result\[1\]\.Row\[(\d+)\]\.(\w+)/
for(var propertyName in raw){
const parsedRow = propertyName.match(regex);
if(parsedRow){
const index = parsedRow[1];
const parsedPropertyName = parsedRow[2];
if(!goodRows[index]){
goodRows[index] = {};
}
goodRows[index][parsedPropertyName] = raw[propertyName];
}
}
console.debug(goodRows);