将对象数组转换为对象的最佳方法?
我需要将对象数组转换为对象。我已经完成了以下逻辑。有没有最好的方法来处理这个问题?将对象数组转换为对象的最佳方法?
var before = [{
"x": ["2015-10-14T01:59:59.999+05:30", "2015-10-14T03:59:59.998+05:30", "2015-10-14T05:59:59.997+05:30", "2015-10-14T07:59:59.996+05:30", "2015-10-14T09:59:59.995+05:30", "2015-10-14T11:59:59.994+05:30", "2015-10-14T13:59:59.993+05:30", "2015-10-14T15:59:59.992+05:30", "2015-10-14T17:59:59.991+05:30", "2015-10-14T19:59:59.990+05:30", "2015-10-14T21:59:59.989+05:30", "2015-10-14T23:59:59.988+05:30"]
}, {
"CleanCoal": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}, {
"Middelings": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}, {
"Prime": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}, {
"SpiralProd": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}];
var after = {};
for (var i = 0; i < before.length; i++) {
var keys = Object.keys(before[i]);
after[keys] = before[i][keys];
}
console.log(after)
document.writeln(JSON.stringify(after))
您可以使用forEach遍历数组,你忘了,如果里面有多种元素迭代嵌套阵列上方的一个对象。
所以,有问题的代码不会为
var arr = [{'a': 'b', 'c': 'd'}];
演示
var before = [{
"x": ["2015-10-14T01:59:59.999+05:30", "2015-10-14T03:59:59.998+05:30", "2015-10-14T05:59:59.997+05:30", "2015-10-14T07:59:59.996+05:30", "2015-10-14T09:59:59.995+05:30", "2015-10-14T11:59:59.994+05:30", "2015-10-14T13:59:59.993+05:30", "2015-10-14T15:59:59.992+05:30", "2015-10-14T17:59:59.991+05:30", "2015-10-14T19:59:59.990+05:30", "2015-10-14T21:59:59.989+05:30", "2015-10-14T23:59:59.988+05:30"]
}, {
"CleanCoal": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}, {
"Middelings": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}, {
"Prime": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}, {
"SpiralProd": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}];
var after = {};
before.forEach(function(obj) {
// obj here is the element of the array, i.e. object
// Looping over all the keys of the object
Object.keys(obj).forEach(function(key) {
// key here is the key of the object
after[key] = obj[key];
});
});
console.log(after);
document.writeln('<pre>' + JSON.stringify(after, 0, 2) + '</pre>');
谢谢你的回复。我还需要将日期格式从字符串更改为日期类型。我更新了代码片段。我可以如何有效地转换? –
@PremkumarJayaseelan请对日期格式更改提出不同的问题 – Tushar
嗨,兄弟,感谢'JSON.stringify(after,0,2)'。我不知道。你怎么看我的答案。你能告诉我(这是否好方法)? –
我们用最好的函数式编程的JavaScript中:
使用reduce
我们不需要临时变量添加到外部范围。
for (var i in obj)
一般快于Obj.keys(obj).forEach
:https://jsperf.com/for-in-versus-object-keys-foreach
var before = [{
"x": ["2015-10-14T01:59:59.999+05:30", "2015-10-14T03:59:59.998+05:30", "2015-10-14T05:59:59.997+05:30", "2015-10-14T07:59:59.996+05:30", "2015-10-14T09:59:59.995+05:30", "2015-10-14T11:59:59.994+05:30", "2015-10-14T13:59:59.993+05:30", "2015-10-14T15:59:59.992+05:30", "2015-10-14T17:59:59.991+05:30", "2015-10-14T19:59:59.990+05:30", "2015-10-14T21:59:59.989+05:30", "2015-10-14T23:59:59.988+05:30"]
}, {
"CleanCoal": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}, {
"Middelings": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}, {
"Prime": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}, {
"SpiralProd": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}];
var after = before.reduce(function(dst, src){
// import every key: val in src into dst
// and keep doing it for every element in the array.
for (var key in src)
if ({}.hasOwnProperty.call(src, key))
dst[key] = src[key];
return dst;
}, {}); // start with an empty object to avoid modifying items in before array.
document.writeln("<pre>" + JSON.stringify(after, null, 4) + "</pre>")
仅有代码的答案不是最优的。你应该解释为什么你的代码符合OP的要求。 – RobG
如何Object.assign工作?
var before = [{
"x": ["2015-10-14T01:59:59.999+05:30", "2015-10-14T03:59:59.998+05:30", "2015-10-14T05:59:59.997+05:30", "2015-10-14T07:59:59.996+05:30", "2015-10-14T09:59:59.995+05:30", "2015-10-14T11:59:59.994+05:30", "2015-10-14T13:59:59.993+05:30", "2015-10-14T15:59:59.992+05:30", "2015-10-14T17:59:59.991+05:30", "2015-10-14T19:59:59.990+05:30", "2015-10-14T21:59:59.989+05:30", "2015-10-14T23:59:59.988+05:30"]
}, {
"CleanCoal": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}, {
"Middelings": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}, {
"Prime": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}, {
"SpiralProd": ["0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00", "0.00"]
}];
var after = {};
before.map(function(i){
return Object.assign(after,i);
})
console.log(after)
document.writeln(JSON.stringify(after))
在最新的浏览器[5的ECMAScript],我们有reduce
它返回一个对象下
var before = [{"x":["2015-10-14T01:59:59.999+05:30","2015-10-14T03:59:59.998+05:30","2015-10-14T05:59:59.997+05:30","2015-10-14T07:59:59.996+05:30","2015-10-14T09:59:59.995+05:30","2015-10-14T11:59:59.994+05:30","2015-10-14T13:59:59.993+05:30","2015-10-14T15:59:59.992+05:30","2015-10-14T17:59:59.991+05:30","2015-10-14T19:59:59.990+05:30","2015-10-14T21:59:59.989+05:30","2015-10-14T23:59:59.988+05:30"]},{"CleanCoal":["0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00"]},{"Middelings":["0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00"]},{"Prime":["0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00"]},{"SpiralProd":["0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00"]}];
var object = before.reduce(function(o, v, i) {
o[i] = v;
return o;
}, {});
console.log(object);
* reduce *不一定会返回一个对象,它将返回任何回调作为累加器返回的值(可以是任何值)。 MDN提供了[polyfill for * reduce *](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Polyfill),因此也适应了旧版浏览器。 – RobG
@RobG是的,这是真的!有点为我学习以及:)谢谢! –
你可以做到这一点通过JSON.stringify()
var before = [{
"x": ["1", "2"],
y: {
a: 3
}
}, {
"CleanCoal": ["0.00", "0.00"],
b: 4
}, {
"Middelings": ["0.00", "0.00"]
}, {
"Prime": ["0.00", "0.00", "0.00"]
}, {
"SpiralProd": ["0.00", "0.00", "0.00"]
}];
var after = {};
var b = "",
i = -1;
while (before[++i]) {
var str = JSON.stringify(before[i]);
b += str.slice(1, str.length - 1);
if (before[i + 1]) b += ",";
}
after = JSON.parse("{" + b + "}");
console.log(after);
document.write("<pre>" + JSON.stringify(after, 0, 3) + "</pre>")
你的版本是不正确的,如果'{A:1,B:4,...}'对象关键将不止一个。 –
您的方法仅适用于内部数组每个只有一个键。多于一个就会失败。你需要第二个循环。 – Yoshi