根据 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 示例 NomePeso 之间的循环,这些数组的名称是动态的,没有静态名称!

我的想法示例:

[
  {
    "_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 元素)
  • 否则就returnvas-is

约束

如果 inner-array(对于“Nome”、“Peso”或其他“动态键”)有多个元素,则仅考虑来自索引 0 的 value 元素。

注意

此解决方案不会改变 original-array。它会创建一个新副本,如果需要,这可能是 re-assigned 到 original-array。