如何展平对象的嵌套数组并复制父对象

use*_*731 0 javascript arrays flatten ramda.js

我有一个对象数组,其中一个属性("attributes")作为对象数组。

var products = [
    {
        "productId": "1",
        "attributes": [
            {
                "variant":"red",
                "price": "134.00"
            }
        ]
    },
    {
        "productId": "2",
        "attributes": [
            {
                "variant": "green",
                "value": "3400.00"
            },
            {
                "variant": "pink",
                "price": "342.00"
            }
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)

我希望将对象的嵌套数组展平并复制到父对象上,但需要为每个嵌套对象复制父对象。(不确定我是否解释正确)。

转换后的对象数组应该是:

var transformedProducts = [
    {
        "productId": "1",
        "variant":"red",
        "price": "134.00"
    },
    {
        "productId": "2",
        "variant": "green",
        "value": "3400.00"
    },
    {
        "productId": "2",
        "variant": "pink",
        "price": "342.00"
    }
]
Run Code Online (Sandbox Code Playgroud)

我可以映射外部数组,然后再次映射内部数组,并在最里面的映射中构造一个新对象。
是否有更好或更实用的方法?

Ori*_*ori 7

您可以使用Array.flatMap()迭代对象,然后迭代attributeswith Array.map(),并与对象的其余部分组合。它还Array.flatMap()会将数组的数组展平为单个数组。

const fn = arr => arr.flatMap(({ attributes, ...rest }) => 
  attributes.map(o => ({
    ...rest,
    ...o
  }))
)

const products = [{"productId":"1","attributes":[{"variant":"red","price":"134.00"}]},{"productId":"2","attributes":[{"variant":"green","value":"3400.00"},{"variant":"pink","price":"342.00"}]}]

const result = fn(products)

console.log(result)
Run Code Online (Sandbox Code Playgroud)

借助 Ramda,您可以使用 来迭代和展平数组R.chain。要获取与其父项组合的属性数组,可以使用R.ap两个函数的 as 组合器:

  1. 提取属性数组,然后将其应用于第二个函数。
  2. 获取对象的其余部分(不带属性),并创建一个映射函数,将其合并到迭代对象。

const { chain, ap, pipe, prop, applyTo, omit, mergeRight, map } = R

const fn = chain(ap(
  pipe(prop('attributes'), applyTo),
  pipe(omit(['attributes']), mergeRight, map)
))

const products = [{"productId":"1","attributes":[{"variant":"red","price":"134.00"}]},{"productId":"2","attributes":[{"variant":"green","value":"3400.00"},{"variant":"pink","price":"342.00"}]}]

const result = fn(products)

console.log(result)
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js" integrity="sha512-t0vPcE8ynwIFovsylwUuLPIbdhDj6fav2prN9fEu/VYBupsmrmk9x43Hvnt+Mgn2h5YPSJOk7PMo9zIeGedD1A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
Run Code Online (Sandbox Code Playgroud)