[英]Remove nested array from an object
什么是最好的转换方式
const mockResults = [
[{ user: { firstName: '1', lastName: '1' }, status: 'WRONG' }],
[{ user: { firstName: '2',lastName: '2' }, status: 'WRONG' }],
[{ user: { firstName: '3',lastName: '3' }, status: 'CORRECT' }]
];
到
const mockResults = [
{ user: { firstName: '1', lastName: '1' }, status: 'WRONG' },
{ user: { firstName: '2',lastName: '2' }, status: 'WRONG' },
{ user: { firstName: '3',lastName: '3' }, status: 'CORRECT' }
];
整个任务是将mockResults
转换为requiredFormat
,这就是我需要删除嵌套数组的原因:
const requiredFormat = [
{
status: 'WRONG',
data: [{ user: {firstName: '1', lastName: '1'}}, { user: {firstName: '2', lastName: '2'}}],
},
{
status: 'CORRECT',
data: [{ user: {firstName: '3', lastName: '3'}}],
},
];
这是我到目前为止尝试过的: https : //jsfiddle.net/9uLje3sg/
谢谢!
您可以使用来自 Array javascript 对象的 flat 方法。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat
如果你想改变数据的来源并改变它的形状,使用 map 和 reduce 方法可以帮助你。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
在您的精确示例中,当您为每个状态属性创建一个新的对象分组时,reduce 将适合。
const mockResults = [ [{ user: { firstName: '1', lastName: '1' }, status: 'WRONG' }], [{ user: { firstName: '2',lastName: '2' }, status: 'WRONG' }], [{ user: { firstName: '3',lastName: '3' }, status: 'CORRECT' }] ]; const flattedAndReduced = mockResults.flat().reduce( (acc, curr)=>{ const statusIndex = { 'WRONG' : 0, 'CORRECT': 1 }; acc[statusIndex[curr.status]].data.push({ user: curr.user} ); return acc; }, [ { status: 'WRONG', data: [], }, { status: 'CORRECT', data: [], } ] ); console.log(flattedAndReduced);
使用函数map
如下,它返回一个包含所需对象的数组。
let result = mockResults.map(([user]) => user);
这种方法假设原始数组中的每个数组只有一个索引。
根据
requiredFormat
的方法
您可以使用函数reduce
进行分组,使用函数Object.values
来获取所需的输出。
const mockResults = [ [{ user: { firstName: '1', lastName: '1' }, status: 'WRONG' }], [{ user: { firstName: '2',lastName: '2' }, status: 'WRONG' }], [{ user: { firstName: '3',lastName: '3' }, status: 'CORRECT' }] ]; let requiredFormat = Object.values(mockResults.reduce((a, [{user, status}]) => { (a[status] || (a[status] = {data: [], status})).data.push(user); return a; }, Object.create(null))); console.log(requiredFormat);
.as-console-wrapper { max-height: 100% !important; top: 0; }
只需使用Array.prototype.map()
从第一个索引返回对象。
请注意:用const
声明的变量不能修改,请使用 * let
代替。
let mockResults = [ [{ user: { firstName: '1', lastName: '1' }, status: 'WRONG' }], [{ user: { firstName: '2',lastName: '2' }, status: 'WRONG' }], [{ user: { firstName: '3',lastName: '3' }, status: 'CORRECT' }] ]; mockResults = mockResults.map(i => i[0]); console.log(mockResults);
const mockResults = [ [{ user: { firstName: '1', lastName: '1' }, status: 'WRONG' }], [{ user: { firstName: '2',lastName: '2' }, status: 'WRONG' }], [{ user: { firstName: '3',lastName: '3' }, status: 'CORRECT' }] ]; const requiredFormat = [ {status: 'WRONG', data: []}, {status: 'CORRECT', data: []}, ]; for(let [{user,status}] of mockResults) { requiredFormat[ status==="WRONG" ? 0 : 1].data.push({user}); } console.log(requiredFormat);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.