Javascript,在映射期间动态创建空对象副本

时间:2019-05-05 13:39:33

标签: javascript arrays

我正在努力寻找一个好的解决方案来处理我的对象数组。

我有两个数组:

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}]

这是问题所在:我找不到一种动态创建与其他项目对象(副本)具有相同结构的对象的好方法,除了位置,数组的索引和格式外,每个字段均为空

3 个答案:

答案 0 :(得分:1)

您可以像这样使用spread syntax。如果const curriedFlippedMap = _.curry(flippedMap, 2); 的值是items,它将覆盖默认的indexid值。

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()