JavaScript展平对象数组
我有一个数组,它包含几个数组,每个数组包含几个对象,与此类似JavaScript展平对象数组,javascript,arrays,loops,flatten,Javascript,Arrays,Loops,Flatten,我有一个数组,它包含几个数组,每个数组包含几个对象,与此类似 [[object1, object2],[object1],[object1,object2,object3]] 这是登录到控制台的对象的屏幕快照。 什么是将其展平的最佳方法,使其成为一个对象阵列 我试过这个,但运气不好: console.log(searchData); var m = [].concat.apply([],searchData); console.log(m); searchData注销上面的
[[object1, object2],[object1],[object1,object2,object3]]
这是登录到控制台的对象的屏幕快照。
什么是将其展平的最佳方法,使其成为一个对象阵列
我试过这个,但运气不好:
console.log(searchData);
var m = [].concat.apply([],searchData);
console.log(m);
searchData注销上面的屏幕截图,但m注销[]
以下是searchData的实际内容:
[[{"_id":"55064111d06b96d974937a6f","title":"Generic Title","shortname":"generic-title","contents":"<p>The Healing Center offers practical, social, and spiritual support to individuals and families. Services include, but are not limited to: food and clothing, job skills training and job search assistance, auto repair (Saturdays only), mentoring, financial counseling, tutoring, prayer, life skills training, and helpful information about local community services.</p><p>Stay in touch with us:</p>","__v":0},{"_id":"5508e1405c621d4aad2d2969","title":"test english","shortname":"test-page","contents":"<h2>English Test</h2>","__v":0}],[{"_id":"550b336f33a326aaee84f883","shortname":"ok-url","title":"now english","contents":"<p>okokko</p>","category":"Transportation","__v":0}]]
治疗中心为个人和家庭提供实用、社会和精神支持。服务包括但不限于:食品和服装、职业技能培训和求职帮助、汽车修理(仅周六),辅导,财务咨询,家教,祈祷,生活技能培训,以及关于当地社区服务的有用信息。与我们保持联系:,“uu v”:0},{uID:“5508E1405C621D4AAD2969”,“标题:”“测试英语”,“短名”:“测试页面”,“内容:”“英语测试”,“u v”:0},{uID:“550B336F3326AEE84F883”,“短名”:“ok url”,“标题”:“现在的英语”,“内容”:“okokko”,“类别”:“运输”和“\u v”:0}]]
您可以像下面这样使用:-
var arr = [['object1', 'object2'],['object1'],['object1','object2','object3']];
var flattened = [].concat.apply([],arr);
展平
将是您期望的阵列
ES 2020提供了列表的平面列表,如果您想迭代:
[['object1'],['object2'].flat()/['object1',object2']
如果您只需要简单的展平,这可能适用于:
var arr = [['object1', 'object2'],['object1'],['object1','object2','object3']];
var flatenned = arr.reduce(function(a,b){ return a.concat(b) }, []);
对于更复杂的展平,Lodash具有展平功能,这可能是您需要的:
递归展平数组:
函数展平(数组){
return!Array.isArray(数组)?数组:[].concat.apply([],Array.map(展平));
}
var YourFlattedArray=Flatte([[{“_id:“55064111d06b96d974937a6f”,“标题”:“通用标题”,“简称”:“通用标题”,“内容”:”康复中心为个人和家庭提供实用、社会和精神支持。服务包括但不限于:食品和服装、工作技能培训和求职帮助、汽车维修(仅周六),辅导,财务咨询,辅导,祈祷,生活技能培训,以及有关当地社区服务的有用信息。与我们保持联系:,“u v”:0},{u id:“5508e1405c621d4aad2969”,“标题:”“测试英语”,“短名”:“测试页面”,“内容”:“英语测试”,“u v”:0},{u id:“550b33a33aAEE84f883”,“短名”:“ok url”,“标题:“now english”,“contents:“okokko”,“category:“Transportation”,“_uv”:0}]]
);
原木(整平阵列);
功能日志(数据){
document.write('一个用于深度(嵌套)展平的递归解决方案:
函数展平(a){
返回Array.isArray(a)?[].concat.apply([],a.map(展平)):a;
}
ES6更紧凑一些:
function *F(a) {
if (Array.isArray(a)) for (var e of a) yield *F(e); else yield a;
}
>> console.log(Array.from(F([1, [2], 3])));
<< [ 1, 2, 3 ]
为了好玩,可以使用名为“展平”的生成器F
,惰性地生成展平值:
let functional = {
flatten (array) {
if (Array.isArray(array)) {
return Array.prototype.concat(...array.map(this.flatten, this));
}
return array;
}
};
functional.flatten([0, [1, 2], [[3, [4]]]]); // 0, 1, 2, 3, 4
函数*F(a){
如果(a的变量e)的(数组isArray(a))产生*F(e);否则产生a;
}
>>log(Array.from(F([1,2,3]));
使用ES6扩展运算符
Array.prototype.concat(…searchData)
或
[].concat(…搜索数据)
让nestedArray=[[1,2]、[3,4]、[5,6];
设FlatteArray=函数(NesteArray){
设flattarr=[];
nestedArray.forEach(函数(项){
压扁推力(…项);
});
返回平面arr;
};
log(扁平阵列(嵌套阵列));//[1,2,3,4,5,6]
结果
我注意到人们使用的递归对成本不友好,特别是新的ES6标准赋予了我们扩展运算符的功能。当您将项目推入主阵列时,只需使用…它将自动添加展平对象。类似于
function flatten(i,arrayField){
if(Array.isArray(i)) return i.map(c=>flatten(c,arrayField));
if(i.hasOwnProperty(arrayField)) return [{...i,[arrayField]:null},...i[arrayField].map(c=>flatten(c,arrayField))];
return {...i,[arrayField]:null};
}
let data=flatten(myData,'childs');
您可以使用:
const data=[[{id:1},{id:2}],{id:3}]];
const result=data.flat();
控制台日志(结果);
//可以指定深度
constdata2=[[[{id:1}],{id:2}],{id:3}];
const result2=data2.flat(2);
console.log(result2);
我的解决方案是展平对象数组并返回单个数组
flattarrayofobject=(arr)=>{
常数展平={};
arr.forEach((obj)=>{
Object.keys(obj.forEach)((key)=>{
展平[键]=对象[键];
});
});
返回平直;
};
范例
const arr=[
{
验证:{0':'xyzNot verified','1':'xyzVerified'},
角色id:{'1':'xyzMember','2':'xyzAdmin'},
双因素身份验证:{0':'No',1':'Yes'}
},
{状态:{0':'xyzInactive','1':'Active','2':'xyzSuspend'}
]
展平对象(arr)
// {
//验证:{0':'xyzNot verified','1':'xyzVerified'},
//状态:{0':'xyzInactive','1':'Active','2':'xyzSuspend'},
//角色id:{'1':'xyzMember','2':'xyzAdmin'},
//双因素身份验证:{0':'No',1':'Yes'}
// }
如果每个对象都有一个数组并以相同的嵌套方式继续:
[
{
"id": 1,
"title": "t1",
"sort_order": 200,
"childs": [
{
"id": 2,
"title": "t2",
"sort_order": 200,
"childs": []
},
{
"id": 3,
"title":"mytitle",
"sort_order": 200,
"childs": []
},
{
"id": 4,
"title":"mytitle",
"sort_order": 200,
"childs": []
},
{
"id": 5,
"title":"mytitle",
"sort_order": 200,
"childs": []
},
{
"id": 6,
"title":"mytitle",
"sort_order": 200,
"childs": []
}
]
},
{
"id": 7,
"title": "راهنما",
"sort_order":"mytitle",
"childs": [
{
"id": 8,
"title":"mytitle",
"sort_order": 200,
"childs": []
},
{
"id": 9,
"title":"mytitle",
"sort_order": 200,
"childs": []
},
{
"id": 10,
"title":"mytitle",
"sort_order": 200,
"childs": []
}
]
}
我的数据如下:
]我喜欢arr.reduce(函数(a,b){返回a.concat(b);});
因为某种原因,它给了我一个空[]。我尝试过的其他几种方法也有……我不知道为什么?如果所有选项都不起作用,那么你就错了。你能不能也发布searchData的内容?有效:出于某种原因,这会返回一个空数组。你知道为什么会出现这种情况吗?我甚至比我的reduce答案更喜欢这种方法。它在ar上有效ray在答案中提供。出于某种原因,我的数组返回[]。@byrdr您能发布您的具体尝试吗?@Mritunjay您能为您的代码添加解释吗?这是显示为什么选择[]的好例子.reduce vs.flattep!@dandavis好吧,他所需要做的就是指定.flatte
的可选参数以获得深层行为,或者调用.flattedeep
。这很有效!谢谢你,我会的
var arr = [1,[9,22],[[3]]];
var res = [];
function flatten(arr){
for(let i=0;i<arr.length;i++){
if(typeof arr[i] == "number"){
res.push(arr[i]);
}
else if(typeof arr[i] == "object"){
fatten(arr[i]);
}
}
}
flatten(arr);
console.log(res);
[1, 9, 22, 3]
array.push(...subarray1) // subarray1 = [object1, object2]
array.push(...subarray2) // subarray2 = [object3]
array.push(...subarray3) // subarray3 = [object4,object5, object6]
// output -> array = [object1, object2, object3, object4, object5, object6]
function flatten(i,arrayField){
if(Array.isArray(i)) return i.map(c=>flatten(c,arrayField));
if(i.hasOwnProperty(arrayField)) return [{...i,[arrayField]:null},...i[arrayField].map(c=>flatten(c,arrayField))];
return {...i,[arrayField]:null};
}
let data=flatten(myData,'childs');
[
{
"id": 1,
"title": "t1",
"sort_order": 200,
"childs": [
{
"id": 2,
"title": "t2",
"sort_order": 200,
"childs": []
},
{
"id": 3,
"title":"mytitle",
"sort_order": 200,
"childs": []
},
{
"id": 4,
"title":"mytitle",
"sort_order": 200,
"childs": []
},
{
"id": 5,
"title":"mytitle",
"sort_order": 200,
"childs": []
},
{
"id": 6,
"title":"mytitle",
"sort_order": 200,
"childs": []
}
]
},
{
"id": 7,
"title": "راهنما",
"sort_order":"mytitle",
"childs": [
{
"id": 8,
"title":"mytitle",
"sort_order": 200,
"childs": []
},
{
"id": 9,
"title":"mytitle",
"sort_order": 200,
"childs": []
},
{
"id": 10,
"title":"mytitle",
"sort_order": 200,
"childs": []
}
]
}