根据 object 的 child 创建数组
create array on basis of object's child
我有这样的数组:
[
{
"_id": "62434e4c52a870a3840f40fd",
"Nome": [
{
"_id": "61f76c3c7a308dd136f1d33a",
"value": "Oo",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"Peso": [
{
"_id": "61f92ec87a308dd136c0e182",
"value": "554",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"createdAt": [
{
"value": "29/03/2022 03:22:02"
}
]
},
{
"_id": "62449de6ed196e40cb4309ae",
"Nome": [
{
"_id": "61f76c3c7a308dd136f1d33a",
"value": "Ssg",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"Peso": [
{
"_id": "61f92ec87a308dd136c0e182",
"value": "255",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"createdAt": [
{
"value": "29/03/2022 03:23:26"
}
]
},
],
我遇到的问题是每个 object 示例 Nome
、Peso
之间的循环,这些数组的名称是动态的,没有静态名称!
我的想法示例:
[
{
"_id": "62434e4c52a870a3840f40fd",
"Nome": "Oo",
"Peso": "554",
"createdAt": "29/03/2022 03:22:02"
},
{
"_id": "62449de6ed196e40cb4309ae",
"Nome": "Ssg",
"Peso": "255",
"createdAt": "29/03/2022 03:23:26"
}
],
感谢帮助:D
如果每个 Nome
, Peso
, createdAt
属性 数组总是有一个元素,那么你可以使用 Array#map
如下:
const input = [ { "_id": "62434e4c52a870a3840f40fd", "Nome": [ { "_id": "61f76c3c7a308dd136f1d33a", "value": "Oo", "updatedAt": "2022-05-04T00:00:00.000Z" } ], "Peso": [ { "_id": "61f92ec87a308dd136c0e182", "value": "554", "updatedAt": "2022-05-04T00:00:00.000Z" } ], "createdAt": [ { "value": "29/03/2022 03:22:02" } ] }, { "_id": "62449de6ed196e40cb4309ae", "Nome": [ { "_id": "61f76c3c7a308dd136f1d33a", "value": "Ssg", "updatedAt": "2022-05-04T00:00:00.000Z" } ], "Peso": [ { "_id": "61f92ec87a308dd136c0e182", "value": "255", "updatedAt": "2022-05-04T00:00:00.000Z" } ], "createdAt": [ { "value": "29/03/2022 03:23:26" } ] } ];
const output = input.map(({_id,...rest}) => ({
_id,
...Object.fromEntries(
Object.entries(rest).map(([k,v]) => [k,v[0].value])
)
}));
console.log( output );
如果考虑到那些动态键会有数组,那么请尝试下面的代码。
const data = [{
"_id": "62434e4c52a870a3840f40fd",
"Nome": [{
"_id": "61f76c3c7a308dd136f1d33a",
"value": "Oo",
"updatedAt": "2022-05-04T00:00:00.000Z"
}],
"Peso": [{
"_id": "61f92ec87a308dd136c0e182",
"value": "554",
"updatedAt": "2022-05-04T00:00:00.000Z"
}],
"createdAt": [{
"value": "29/03/2022 03:22:02"
}]
},
{
"_id": "62449de6ed196e40cb4309ae",
"Nome": [{
"_id": "61f76c3c7a308dd136f1d33a",
"value": "Ssg",
"updatedAt": "2022-05-04T00:00:00.000Z"
}],
"Peso": [{
"_id": "61f92ec87a308dd136c0e182",
"value": "255",
"updatedAt": "2022-05-04T00:00:00.000Z"
}],
"createdAt": [{
"value": "29/03/2022 03:23:26"
}]
},
];
data.map(d => {
Object.keys(d).forEach(k => {
if (Array.isArray(d[k]) && d[k].length > 0)
d[k] = d[k][0].value;
});
});
console.log(data);
以下可能是实现所需 objective 的一种可能解决方案。
代码段
const transformArr = arr => (
arr.map(obj => ({
...Object.fromEntries(
Object.entries(obj)
.map(([k, v]) => {
if (v && v.length > 0 &&
Array.isArray(v) &&
"value" in v[0]
) {
return [k, v[0].value]
} else {
return [k, v]
}
})
)
}))
);
const origArr = [
{
"_id": "62434e4c52a870a3840f40fd",
"Nome": [
{
"_id": "61f76c3c7a308dd136f1d33a",
"value": "Oo",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"Peso": [
{
"_id": "61f92ec87a308dd136c0e182",
"value": "554",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"createdAt": [
{
"value": "29/03/2022 03:22:02"
}
]
},
{
"_id": "62449de6ed196e40cb4309ae",
"Nome": [
{
"_id": "61f76c3c7a308dd136f1d33a",
"value": "Ssg",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"Peso": [
{
"_id": "61f92ec87a308dd136c0e182",
"value": "255",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"createdAt": [
{
"value": "29/03/2022 03:23:26"
}
]
},
];
console.log(transformArr(origArr));
说明
- 遍历数组
- 使用
Object.entries()
和Object.fromEntries()
提取key-value[k, v]
对(作为数组)然后re-create(key-value对数组返回进入一个)对象
- 检查
v
是否是一个数组,并且它在索引 0 处有一个带有属性 value
的元素
- 如果是,则将其转换为仅显示
value
(index-0 元素)
- 否则就return
v
as-is
约束
如果 inner-array(对于“Nome”、“Peso”或其他“动态键”)有多个元素,则仅考虑来自索引 0 的 value
元素。
注意
此解决方案不会改变 original-array。它会创建一个新副本,如果需要,这可能是 re-assigned 到 original-array。
我有这样的数组:
[
{
"_id": "62434e4c52a870a3840f40fd",
"Nome": [
{
"_id": "61f76c3c7a308dd136f1d33a",
"value": "Oo",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"Peso": [
{
"_id": "61f92ec87a308dd136c0e182",
"value": "554",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"createdAt": [
{
"value": "29/03/2022 03:22:02"
}
]
},
{
"_id": "62449de6ed196e40cb4309ae",
"Nome": [
{
"_id": "61f76c3c7a308dd136f1d33a",
"value": "Ssg",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"Peso": [
{
"_id": "61f92ec87a308dd136c0e182",
"value": "255",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"createdAt": [
{
"value": "29/03/2022 03:23:26"
}
]
},
],
我遇到的问题是每个 object 示例 Nome
、Peso
之间的循环,这些数组的名称是动态的,没有静态名称!
我的想法示例:
[
{
"_id": "62434e4c52a870a3840f40fd",
"Nome": "Oo",
"Peso": "554",
"createdAt": "29/03/2022 03:22:02"
},
{
"_id": "62449de6ed196e40cb4309ae",
"Nome": "Ssg",
"Peso": "255",
"createdAt": "29/03/2022 03:23:26"
}
],
感谢帮助:D
如果每个 Nome
, Peso
, createdAt
属性 数组总是有一个元素,那么你可以使用 Array#map
如下:
const input = [ { "_id": "62434e4c52a870a3840f40fd", "Nome": [ { "_id": "61f76c3c7a308dd136f1d33a", "value": "Oo", "updatedAt": "2022-05-04T00:00:00.000Z" } ], "Peso": [ { "_id": "61f92ec87a308dd136c0e182", "value": "554", "updatedAt": "2022-05-04T00:00:00.000Z" } ], "createdAt": [ { "value": "29/03/2022 03:22:02" } ] }, { "_id": "62449de6ed196e40cb4309ae", "Nome": [ { "_id": "61f76c3c7a308dd136f1d33a", "value": "Ssg", "updatedAt": "2022-05-04T00:00:00.000Z" } ], "Peso": [ { "_id": "61f92ec87a308dd136c0e182", "value": "255", "updatedAt": "2022-05-04T00:00:00.000Z" } ], "createdAt": [ { "value": "29/03/2022 03:23:26" } ] } ];
const output = input.map(({_id,...rest}) => ({
_id,
...Object.fromEntries(
Object.entries(rest).map(([k,v]) => [k,v[0].value])
)
}));
console.log( output );
如果考虑到那些动态键会有数组,那么请尝试下面的代码。
const data = [{
"_id": "62434e4c52a870a3840f40fd",
"Nome": [{
"_id": "61f76c3c7a308dd136f1d33a",
"value": "Oo",
"updatedAt": "2022-05-04T00:00:00.000Z"
}],
"Peso": [{
"_id": "61f92ec87a308dd136c0e182",
"value": "554",
"updatedAt": "2022-05-04T00:00:00.000Z"
}],
"createdAt": [{
"value": "29/03/2022 03:22:02"
}]
},
{
"_id": "62449de6ed196e40cb4309ae",
"Nome": [{
"_id": "61f76c3c7a308dd136f1d33a",
"value": "Ssg",
"updatedAt": "2022-05-04T00:00:00.000Z"
}],
"Peso": [{
"_id": "61f92ec87a308dd136c0e182",
"value": "255",
"updatedAt": "2022-05-04T00:00:00.000Z"
}],
"createdAt": [{
"value": "29/03/2022 03:23:26"
}]
},
];
data.map(d => {
Object.keys(d).forEach(k => {
if (Array.isArray(d[k]) && d[k].length > 0)
d[k] = d[k][0].value;
});
});
console.log(data);
以下可能是实现所需 objective 的一种可能解决方案。
代码段
const transformArr = arr => (
arr.map(obj => ({
...Object.fromEntries(
Object.entries(obj)
.map(([k, v]) => {
if (v && v.length > 0 &&
Array.isArray(v) &&
"value" in v[0]
) {
return [k, v[0].value]
} else {
return [k, v]
}
})
)
}))
);
const origArr = [
{
"_id": "62434e4c52a870a3840f40fd",
"Nome": [
{
"_id": "61f76c3c7a308dd136f1d33a",
"value": "Oo",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"Peso": [
{
"_id": "61f92ec87a308dd136c0e182",
"value": "554",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"createdAt": [
{
"value": "29/03/2022 03:22:02"
}
]
},
{
"_id": "62449de6ed196e40cb4309ae",
"Nome": [
{
"_id": "61f76c3c7a308dd136f1d33a",
"value": "Ssg",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"Peso": [
{
"_id": "61f92ec87a308dd136c0e182",
"value": "255",
"updatedAt": "2022-05-04T00:00:00.000Z"
}
],
"createdAt": [
{
"value": "29/03/2022 03:23:26"
}
]
},
];
console.log(transformArr(origArr));
说明
- 遍历数组
- 使用
Object.entries()
和Object.fromEntries()
提取key-value[k, v]
对(作为数组)然后re-create(key-value对数组返回进入一个)对象 - 检查
v
是否是一个数组,并且它在索引 0 处有一个带有属性value
的元素
- 如果是,则将其转换为仅显示
value
(index-0 元素) - 否则就return
v
as-is
约束
如果 inner-array(对于“Nome”、“Peso”或其他“动态键”)有多个元素,则仅考虑来自索引 0 的 value
元素。
注意
此解决方案不会改变 original-array。它会创建一个新副本,如果需要,这可能是 re-assigned 到 original-array。