优化 JavaScript 中嵌套 json 个对象数组的扁平化
Optmize flattening of an array of nested json objects in JavaScript
应该有一个对象数组,比如
[
{
"key_set1": {
int_val: 3,
arr_val: [
1,
3,
4
]
}
},
{
"key_set2": {
string_val: "foo"
}
}
]
我想将内部对象键展平到一个新的根对象以得到最后
{
"key_set1": {
"int_val": 3,
"arr_val": [
1,
3,
4
]
},
"key_set2": {
"string_val": "foo"
}
}
假设
- 此嵌套结构可以有 N 层且 N > 10
- 该结构是一个有效的 json 对象而不是 javascript 对象,即它具有 atomit/non 原子类型,而不是
function
对象类型;
- 整个输入json文件可以是几百KBytes;
- 工作必须在 JavaScript V8 / ECMAScript6 中完成;
- 处理时间必须为毫秒级
- 此映射的变体,需要解析输入 json 对象并修改值(如使用
map
数组方法)。
我想为此使用 forEach
and/or 快速迭代器 for
、while
等内置方法获得最优化的解决方案,对于 best/worst 例。
只要我没理解错,你喜欢用对象替换数组,把第一级key作为result对象的新key
var array = [{ "key_set1": { int_val: 3, arr_val: [1, 3, 4] } }, { "key_set2": { string_val: "foo" } }],
object = {};
array.forEach(function (a) {
var key = Object.keys(a)[0];
object[key] = a[key];
});
console.log(object);
如果你 "want to get this optimized at its best" - 你不应该在你的情况下使用 Array.map
因为它 returns 一个新数组。
您只需要快速遍历 list
数组并填充新的 flattened
对象。
考虑以下 "optimized" 解决方案:
var flattened = {}, len = list.length;
while (len--) {
Object.keys(list[len]).forEach((k) => (flattened[k] = list[len][k]));
}
console.log(JSON.stringify(flattened, 0, 4));
输出:
{
"key_set2": {
"string_val": "foo"
},
"key_set1": {
"int_val": 3,
"arr_val": [
1,
3,
4
]
}
}
应该有一个对象数组,比如
[
{
"key_set1": {
int_val: 3,
arr_val: [
1,
3,
4
]
}
},
{
"key_set2": {
string_val: "foo"
}
}
]
我想将内部对象键展平到一个新的根对象以得到最后
{
"key_set1": {
"int_val": 3,
"arr_val": [
1,
3,
4
]
},
"key_set2": {
"string_val": "foo"
}
}
假设
- 此嵌套结构可以有 N 层且 N > 10
- 该结构是一个有效的 json 对象而不是 javascript 对象,即它具有 atomit/non 原子类型,而不是
function
对象类型; - 整个输入json文件可以是几百KBytes;
- 工作必须在 JavaScript V8 / ECMAScript6 中完成;
- 处理时间必须为毫秒级
- 此映射的变体,需要解析输入 json 对象并修改值(如使用
map
数组方法)。
我想为此使用 forEach
and/or 快速迭代器 for
、while
等内置方法获得最优化的解决方案,对于 best/worst 例。
只要我没理解错,你喜欢用对象替换数组,把第一级key作为result对象的新key
var array = [{ "key_set1": { int_val: 3, arr_val: [1, 3, 4] } }, { "key_set2": { string_val: "foo" } }],
object = {};
array.forEach(function (a) {
var key = Object.keys(a)[0];
object[key] = a[key];
});
console.log(object);
如果你 "want to get this optimized at its best" - 你不应该在你的情况下使用 Array.map
因为它 returns 一个新数组。
您只需要快速遍历 list
数组并填充新的 flattened
对象。
考虑以下 "optimized" 解决方案:
var flattened = {}, len = list.length;
while (len--) {
Object.keys(list[len]).forEach((k) => (flattened[k] = list[len][k]));
}
console.log(JSON.stringify(flattened, 0, 4));
输出:
{
"key_set2": {
"string_val": "foo"
},
"key_set1": {
"int_val": 3,
"arr_val": [
1,
3,
4
]
}
}