我正在努力寻找一个好的解决方案来处理我的对象数组。
我有两个数组:
let structure = ["horizontal","vertical","small","small","small"]
let items = [{"id":1,"title":"xxxxx","format":"horizontal","position":0},
{"id":3,"title":"xxxxx","format":"vertical","position":1},
{"id":6,"title":"xxxxx","format":"small","position":2},
{"id":9,"title":"xxxxx","format":"small","position":3},
{"id":11,"title":"xxxxx","format":"small","position":4}]
编辑:项目比这更复杂:它具有约15个属性...
structure
具有动态长度,是我的参考数组。更改structure
时,我必须重新映射items数组,以根据structure
更改格式。因此,如果我将structure
更改为
let structure = ["horizontal","vertical","vertical","vertical","small"]
数组必须更改为
let items = [{"id":1,"title":"xxxxx","format":"horizontal","position":0},
{"id":3,"title":"xxxxx","format":"vertical","position":1},
{"id":6,"title":"xxxxx","format":"vertical","position":2},
{"id":9,"title":"xxxxx","format":"vertical","position":3},
{"id":11,"title":"xxxxx","format":"small","position":4}]
这可以通过地图来完成。
这是我的Vue方法,我映射了结构并使用函数changeStructure
更改了格式。
methods: {
changeStructure(object,structure) {
object.format = structure
return object
},
updateCoverElements() {
let structure = this.coverTypes[this.currentCoverVersion]
let elements = this.coverElements
let changeStructure = this.changeStructure
let revisedElement = structure.map(function(structure, index) {
return changeStructure(elements[index],structure)
});
console.log(revisedElement);
}
},
但是问题是,正如我之前所说的,结构具有动态长度。
所以当我更改为
let structure = ["horizontal","vertical","vertical"]
项目结果必须为
let items = [{"id":1,"title":"xxxxx","format":"horizontal","position":0},
{"id":3,"title":"xxxxx","format":"vertical","position":1},
{"id":6,"title":"xxxxx","format":"vertical","position":2}]
如果新的structure
长度包含较少的元素,这不是问题。
但是当我更改为
let structure = ["horizontal","vertical","vertical","vertical","vertical","vertical","vertical"]
项目结果必须为
let items = [{"id":1,"title":"xxxxx","format":"horizontal","position":0},
{"id":3,"title":"xxxxx","format":"vertical","position":1},
{"id":6,"title":"xxxxx","format":"vertical","position":2},
{"id":"","title":"","format":"vertical","position":3},
{"id":"","title":"","format":"vertical","position":4},
{"id":"","title":"","format":"vertical","position":5},
{"id":"","title":"","format":"vertical","position":6}]
这是问题所在:我找不到一种动态创建与其他项目对象(副本)具有相同结构的对象的好方法,除了位置,数组的索引和格式外,每个字段均为空
答案 0 :(得分:1)
您可以像这样使用spread syntax。如果const curriedFlippedMap = _.curry(flippedMap, 2);
的值是items
,它将覆盖默认的index
和id
值。
title
答案 1 :(得分:1)
只需分割一个新的项目副本,其中最多包含let structure = ["horizontal","vertical","vertical","vertical","vertical","vertical","vertical"]
let items = [{"id":1,"title":"xxxxx","format":"horizontal","position":0},
{"id":3,"title":"xxxxx","format":"vertical","position":1},
{"id":6,"title":"xxxxx","format":"vertical","position":2}]
const defaultObj = { id: '', title: '' }
const newItems = structure.map((format, position) => {
return { ...defaultObj, ...items[position], format, position }
})
console.log(newItems)
个项目,然后遍历新的项目克隆并设置每个structure.length
属性。最后,为format
中任何在structure
中没有对应伙伴的元素创建新对象:
items
答案 2 :(得分:0)
使用map()
方法解决此问题的最佳方法是组织实现功能,以便您可以在任何需要的地方使用不同的数据集多次调用它(可重用性的概念)。
这是我尝试过的。我定义了名为getAlteredArray(items, structure)
的函数,该函数返回所需的数组。请注意,如果您要使用 map()方法意味着您想要一个新数组(我的意思是您不想更改传递的数组)。
我在代码本身上粘贴了 o / p (已注释掉)。
// function that creates new array with desired items and returns to the caller
function getAlteredArray(items, structure) {
let newArr = items.map((obj, index) => {
// obj => {"id":1,"title":"xxxxx","format":"horizontal","position":0}
obj["format"] = structure[index]
return obj
})
return newArr
}
// function that creates set of data needs to be passed to getAlteredArray() function
function test() {
let items = [{"id":1,"title":"xxxxx","format":"horizontal","position":0},
{"id":3,"title":"xxxxx","format":"vertical","position":1},
{"id":6,"title":"xxxxx","format":"small","position":2},
{"id":9,"title":"xxxxx","format":"small","position":3},
{"id":11,"title":"xxxxx","format":"small","position":4}]
// TEST 1 - Call getAlteredArray() with `items` & `structure`
let structure = ["horizontal","vertical","vertical","vertical","small"]
let newArr = getAlteredArray(items, structure)
console.log(newArr)
/*
[ { id: 1, title: 'xxxxx', format: 'horizontal', position: 0 },
{ id: 3, title: 'xxxxx', format: 'vertical', position: 1 },
{ id: 6, title: 'xxxxx', format: 'vertical', position: 2 },
{ id: 9, title: 'xxxxx', format: 'vertical', position: 3 },
{ id: 11, title: 'xxxxx', format: 'small', position: 4 } ]
*/
// TEST 2
let structure2 = ["horizontal","vertical","small","small","small"]
let newArr2 = getAlteredArray(items, structure2)
console.log(newArr2)
/*
[ { id: 1, title: 'xxxxx', format: 'horizontal', position: 0 },
{ id: 3, title: 'xxxxx', format: 'vertical', position: 1 },
{ id: 6, title: 'xxxxx', format: 'small', position: 2 },
{ id: 9, title: 'xxxxx', format: 'small', position: 3 },
{ id: 11, title: 'xxxxx', format: 'small', position: 4 } ]
*/
}
// Start
test()