遍历Javascript中扁平化对象的子部分

时间:2018-09-27 19:16:19

标签: javascript node.js

我有一个需要展平的对象。下面的代码段是一个示例:

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的任何东西。

2 个答案:

答案 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);