我有三个数组:颜色对象、大小对象、SKU 对象。 这些是使用 API 调用从数据库中获取的,并存储在 Vue data(( 中。 然后,我使用地图构建一个大小和颜色的 2D 矩阵(如果存在(并找到运算符
this.sizes.map(
size=> this.colours.map(
colour=>(
this.skus.find(
sku=> sku.sku == this.style.name + colour.colour_code + size.code
) || {sku: this.style.name + colour.colour_code + size.code, selected:false}
)
)
)
我需要将结果分配给一个新数组 (this.matrix(,但是对于 UI,我还需要一个不在 sku 对象中的附加字段 (selected:false(,它不需要存在于数据库中,因为它仅用于状态控制。 为此,我认为我需要使用 Object.assign({selected:false}, sku(,但我无法弄清楚我会把它放在上面的代码中的位置。 我必须按照分配的 this.matrix 来做,否则 Vue 不会生成 getter 和 setter
2D 数组中的每个单元格引用在 SKU 数组中将有 0 或 1 个 SKU。SKU 阵列中的每个 SKU 在 2D 数组中都有一个对应的插槽。
我会把 Object.asassigned 放在哪里,还是有更好的方法?
我会稍微简化一下,因为你的问题与 VueJS 并不真正相关。
let sizes = [1,2,3];
let cols = ['a','b','c']
let sku = ['1.a', '2.c'];
sizes.map(
s => cols.map(
c => s+"."+c ).map(
x => ({sku: x,
selected: sku.find(s => s === x) ? true : false})))
//result is
//[
// [ {sku: "1.a", selected: true}, {sku: "1.b", selected: false} ...],
// [ ... ],
// [ ....]
//]
即链接另一个映射以到达sku
表示,然后映射到结果对象。然后,您可以将结果分配给 2D 对象矩阵。
如果您的矩阵非常大,并且您不想为矩阵中的每个单元格重新创建一个新对象,则可以使用 map 提供索引的事实作为第二个可选的箭头函数参数:sized.map( (s,i) => cols.map( (c,j) => { ... }
。代码的可读性会降低,但您可以直接操作矩阵。
的解决方案:
this.sizes.map(
size=> this.colours.map(
colour=>(
Object.assign(
{
sku: this.style.name + colour.colour_code + size.code,
selected: false
},
this.skus.find(
sku=> sku.sku == this.style.name + colour.colour_code + size.code
)
)
)
)
)
现在,这是创建一个具有 sku 和 selected 的新对象,如果它找到匹配的 sku 对象,则将属性(通过 Object.assign(扩展到一个新对象中。 SKU 属性存在于两个源对象中,但只会输出一次。
现在开始获得 OT,2D 数组中的每个对象都必须具有"sku"属性,因此它需要存在于目标数组中,以防源数组为 NULL。如果我插入一个变量然后调用该变量两次,代码可能会更具可读性,但它正在执行相同的逻辑。
this.sizes.map(
size=> this.colours.map(
colour=>(
skuCode=this.style.name + colour.colour_code + size.code;
Object.assign(
{
sku: skuCode,
selected: false
},
this.skus.find(
sku=> sku.sku == skuCode
)
)
)
)
)