javascript - 转换数据时 obj[i] 在 javascript 中不可迭代

标签 javascript ecmascript-6

我正在尝试将数据从一种格式转换为另一种格式,但收到错误 obj[i] 不可迭代 为什么我想获得预期输出如下变量所示

const data = {
    "GENERAL": {
        "value": null,
        "type": "LABEL",
    },
    "Mobile NUMBER": {
        "value": "04061511",
        "type": "FIELD",

    },

   "Abc NUMBER": {
        "value": "89999",
        "type": "FIELD",

    },
    "Personal Info": {
        "value": null,
        "type": "LABEL",
    },
    "Address": {
        "value": "g-78",
        "type": "FIELD",

    }, "local": {
        "value": "090099",
        "type": "FIELD",

    }
}

const obj = {}
for (var i in data) {
    const {type} = data[i];
    if (type === 'LABEL') {
        obj[i] = []

    } else {
        obj[i] = [...obj[i], data[i]]
    }

}

console.log(obj)


const expectedout = {
    "GENERAL": [{
        "value": "04061511",
        "type": "FIELD",
        "displaytext": "Mobile NUMBER"

    }, {
        "value": "89999",
        "type": "FIELD",
        "displaytext": "Abc NUMBER"

    }],
  "Personal Info": [{
        "value": "g-78",
        "type": "FIELD",
        "displaytext": "Address"

    }, {
        "value": "090099",
        "type": "FIELD",
        "displaytext": "local"

    }]
}

有没有更好的方法可以将我当前的数据转换为期望的数据?我是React中的ES6 这是我的代码

https://jsbin.com/sesipuzeni/1/edit?html,js,console,output

更新

var obj = {
  "first":"first",
  "2":"2",
  "34":"34",
  "1":"1",
  "second":"second"
};
for (var i in obj) { console.log(i); };
VM5628:8 

似乎对象属性没有保证。当你有数字和字符串时,yes 是正确的

但是当你总是使用“字符串”时,它的顺序是相同的

var obj = {
  "first":{a:"jjj"},
  "yyy":{a:"jjqej"},
  "ttt":{a:"jjsqj"},
  "ggg":{a:"jjjs"},
  "second":{a:"jjcj"}
};
for (var i in obj) { console.log(i); };

最佳答案

问题是,当您处理原始对象的下一个元素时,i 不再是包含值数组的元素的键。您需要将其保存在另一个变量中。

const data = {
  "GENERAL": {
    "value": null,
    "type": "LABEL",
  },
  "Mobile NUMBER": {
    "value": "04061511",
    "type": "FIELD",
  },

  "Abc NUMBER": {
    "value": "89999",
    "type": "FIELD",
  },
  "Personal Info": {
    "value": null,
    "type": "LABEL",
  },
  "Address": {
    "value": "g-78",
    "type": "FIELD",

  },
  "local": {
    "value": "090099",
    "type": "FIELD",
  }
}

const obj = {};
var lastLabel;
for (var i in data) {
  if (data[i].type === 'LABEL') {
    obj[i] = []
    lastLabel = i;
  } else {
    data[i].displaytext = i;
    obj[lastLabel] = [...obj[lastLabel], data[i]]
  }
}

console.log(obj)

请注意,整个方法依赖于对象属性保留其顺序,这在 JavaScript 中是无法保证的。但我认为它恰好适用于大多数现有的实现。

关于javascript - 转换数据时 obj[i] 在 javascript 中不可迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53678749/

相关文章:

javascript - 使用 .get() 检索服务器上文件夹中所有文件名的数组

javascript - 使用 RxJs 在 node.js 中遍历目录树

javascript - 类型错误 : format is not a function in date-fns

javascript - 如何使用 JavaScript 设置 marginLeft 属性?

javascript - 为什么即使我在 2 个不同的范围内声明变量仍然存在重复错误?

javascript - 混合使用 ES6 Promise 和 JQuery Promise

javascript - Node.js 不支持 ES6 导入和导出

javascript - 按位运算 - 零填充右移(>>>)用法?

javascript - ES6 类方法在 forEach 循环内不返回任何内容

angular - 在 typescript 中传播语法