Javascript 转换对象模型的最有效方法是什么?

Javascript 转换对象模型的最有效方法是什么?,javascript,ecmascript-6,Javascript,Ecmascript 6,我在前端有一个初始静态模型。看起来是这样的: [ { completed: false, id: 0, index: 0, isNavigationAllowed: true, name: 'Test1', }, { completed: false, id: 1, index: 1, isNavigationAllowed: f

我在前端有一个初始静态模型。看起来是这样的:

[
    {
        completed: false,
        id: 0,
        index: 0,
        isNavigationAllowed: true,
        name: 'Test1',
    },
    {
        completed: false,
        id: 1,
        index: 1,
        isNavigationAllowed: false,
        name: 'Test2',
    },
    {
        completed: false,
        id: 2,
        index: 2,
        isNavigationAllowed: false,
        name: 'Test3',
    },
]

简而言之,我的应用程序的行为就像一个向导页面,所以当用户单击“下一步”按钮时,我应该更改模型(并且不要改变它)。我使用以下转换函数:

function transformWizardStepsModelForNext(step, wizardStepsModel) {
    return wizardStepsModel.reduce((accumulator, currentValue) => {
        if (step === currentValue.index) {
            let newValue = { ...newValue }
            newValue.completed = true
            newValue.isNavigationAllowed = false
            return [...accumulator, newValue]
        }
        return [...accumulator, currentValue]
    }, [])
}

我应该在每个用户单击“下一步”和“上一步”按钮时更改模型中的两个对象(无变化)。因此,在第一次单击之后,我应该更改:第一个对象的completed=true、isNavigationLowed=false字段以及第二个对象的isNavigationLowed=true字段。单击“上一步”按钮时,逻辑相同,但反之亦然。我已经为这个转换选择了reduce-array方法,但是看起来我只能处理一个对象。问题是:从您的角度来看,这里最有效的转换方式是什么?

您可以使用map函数而不是reduce

wizardStepsModel.map(currentValue => {
  if (step === currentValue.index) {
    return { 
      ...currentValue,
      completed: true,
      isNavigationAllowed: false
    }
  } else if (step + 1 === currentValue.index) {
    return { 
      ...currentValue,
      isNavigationAllowed: true
    }
  }
  else return currentValue
})

您可以使用map函数代替reduce

wizardStepsModel.map(currentValue => {
  if (step === currentValue.index) {
    return { 
      ...currentValue,
      completed: true,
      isNavigationAllowed: false
    }
  } else if (step + 1 === currentValue.index) {
    return { 
      ...currentValue,
      isNavigationAllowed: true
    }
  }
  else return currentValue
})

我应该在第一个条件之后更改两个对象only@vmstr那么,在这段代码中,您认为有多少个对象在改变?但实际上,这里的逻辑有点难-在第二次“下一步”单击后(步数将增加1),我应该为第二个对象设置“complete=true”,为第一个对象设置“complete=false”,IsNavigationLowed=两者均为false。对于第三个,IsNavigationLowed=trueobject@vmstr我刚刚演示了一个如何有效地更改数组中的对象的示例,在我的时区,现在已经是晚上了,我对理解更改ATRIBUTESTHX的逻辑有些厌倦,祝您晚安,我会考虑如何使它工作我应该改变两个对象后,第一个条件only@vmstr那么,您认为这段代码中有多少个对象在更改?但实际上,这里的逻辑有点难-在第二次“下一步”单击后(步长计数器将增加1),我应该为第二个对象设置“complete=true”,对于第一个对象,“complete=false”,对于这两个对象,isNavigationLowed=false。对于第三个,IsNavigationLowed=trueobject@vmstr我刚刚演示了一个如何有效地更改数组中的对象的示例,在我的时区,现在已经是晚上了,我对理解更改ATRIBUTESTHX的逻辑有些厌倦,祝您晚安,我将考虑如何使其工作