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)
我可以映射外部数组,然后再次映射内部数组,并在最里面的映射中构造一个新对象。
是否有更好或更实用的方法?
您可以使用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 组合器:
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)