JavaScript中多级对象数组的简化
我有一个JavaScript数组:JavaScript中多级对象数组的简化,javascript,jquery,Javascript,Jquery,我有一个JavaScript数组: var data = [{abc: "vf",def: [{ a:"1", b:"3"},{a:"2",b:"4"}]}]; 我希望将其转换为: [{"abc":"vf","a":"1","b":"3"},{"abc":"vf","a":"2","b":"4"}] 我已经为它编写了JavaScript代码: Javascript: var push_apply = Function.apply.bind([].push); var slic
var data = [{abc: "vf",def: [{ a:"1", b:"3"},{a:"2",b:"4"}]}];
我希望将其转换为:
[{"abc":"vf","a":"1","b":"3"},{"abc":"vf","a":"2","b":"4"}]
我已经为它编写了JavaScript代码:
Javascript:
var push_apply = Function.apply.bind([].push);
var slice_call = Function.call.bind([].slice);
Object.defineProperty(Array.prototype, "pushArrayMembers", {
value: function() {
for (var i = 0; i < arguments.length; i++) {
var to_add = arguments[i];
for (var n = 0; n < to_add.length; n+=300) {
push_apply(this, slice_call(to_add, n, n+300));
}
}
}
});
var globalResultArr = [];
var data = [{abc: "vf",def: [{ a:"1", b:"3"},{a:"2",b:"4"}]}];
function f(){
for(var i=0;i<data.length;i++){ //Iterate Data Array
var obj = data[i];
var resultArray = [{}];
for (var key in obj) { // Iterate Object in Data Array
if (obj.hasOwnProperty(key)) {
if(Object.prototype.toString.call(obj[key]) === "[object Array]"){
var tempRes = $.extend(true, [], resultArray);
resultArray = [];
for(var k=0;k<tempRes.length;k++){
var tempResObj = tempRes[k];
for(var j=0;j<obj[key].length;j++){ // If it has array, then iterate it as well
var innerObj = obj[key][j]; //Iterate Object in inner array
for(var innerkey in innerObj){
if (innerObj.hasOwnProperty(innerkey)) {
tempResObj[innerkey] = innerObj[innerkey];
}
}
resultArray.push(tempResObj);
}
}
}else{
for(var i=0;i<resultArray.length;i++){
resultArray[i][key] = obj[key];
}
}
}
}
globalResultArr.pushArrayMembers(resultArray);
}
document.getElementById("test").innerHTML = JSON.stringify(globalResultArr);
}
f();
var push\u apply=Function.apply.bind([].push);
var slice_call=Function.call.bind([].slice);
Object.defineProperty(Array.prototype,“pushArrayMembers”{
值:函数(){
for(var i=0;i 对于(var i=0;i这里有一个尝试。它假设每个对象中只有一个属性是数组。它将它们与其余属性组成一个对象,并使用数组属性中的每个值创建一个新克隆。
*现在可以按要求工作了*
var resultArray = [],
len = data.length,
tempObj,
newObj,
targetVal,
targetKey,
composeObj,
tempJson,
key,
i, k;
for(i = 0; i < len; i++) {
tempObj = data[i];
// obj to build up
composeObj = {};
// look at all key/vals in obj in data
for(key in tempObj) {
keyObj = tempObj[key];
// is it an array?
if(Array.isArray(keyObj)) {
// save key/val for array property
targetVal = keyObj;
targetKey = key;
}
else {
// copy non-array properties to empty object
composeObj[key] = keyObj;
}
}
// json-ify the object for cloning
tempJson = JSON.stringify(composeObj);
// compose new object for each val in array property
targetVal.map(function(val) {
// clone object
newObj = JSON.parse(tempJson);
// add array values as object properties
for(k in val) {
newObj[k] = val[k];
}
// add to results
resultArray.push(newObj);
});
}
var resultArray=[],
len=data.length,
坦波布,
newObj,
targetVal,
targetKey,
composeObj,
tempJson,
钥匙
i、 k;
对于(i=0;i
我认为Codereview比stackoverflow@maja谢谢,我会的。:)你想要[{“abc”:“vf”,“a”:“1”,“b”:“3”},{“abc”:“vf”,“a”:“2”,“b”:“4”}还是真的想要[{“abc”:“vf”,“a”:“2”,“b”:“4”},{“abc”:“vf”,“a”:“2”,“b”:“4”}]?@TyKroll代码似乎有错误。你想要的是:{“abc”:“vf,{“abc”:“vf”,“a”:“2”,“b”:“4”})。我会编辑这个问题。谢谢你指出它。你的对象中只有两个字段吗?
var resultArray = [],
len = data.length,
tempObj,
newObj,
targetVal,
targetKey,
composeObj,
tempJson,
key,
i, k;
for(i = 0; i < len; i++) {
tempObj = data[i];
// obj to build up
composeObj = {};
// look at all key/vals in obj in data
for(key in tempObj) {
keyObj = tempObj[key];
// is it an array?
if(Array.isArray(keyObj)) {
// save key/val for array property
targetVal = keyObj;
targetKey = key;
}
else {
// copy non-array properties to empty object
composeObj[key] = keyObj;
}
}
// json-ify the object for cloning
tempJson = JSON.stringify(composeObj);
// compose new object for each val in array property
targetVal.map(function(val) {
// clone object
newObj = JSON.parse(tempJson);
// add array values as object properties
for(k in val) {
newObj[k] = val[k];
}
// add to results
resultArray.push(newObj);
});
}