JS / TS最聪明的方法如何遍历对象数组并进行一些更改

时间:2018-10-19 11:58:02

标签: javascript function typescript

有没有最聪明的方法来达到相同的结果?

简要说明:

 routes = [
{ name: 'vehicle', activated: true},
{ name: 'userassignment', activated: true},
{ name: 'relations', activated: true},
{ name: 'journeys', activated: true},
{ name: 'expenses', activated: true}

];

任务-创建一个使用上述数组的函数,并且:

  1. 将“已激活”的所有成员属性更改为false
  2. 将一个特定的“选择”成员设置为true(基于其“名称”)
  3. 如果“选择”是“旅程”或“费用”,则将其设置为“真”,但还设置“关系” 真正的成员

我喜欢下面的代码,但是我的长辈希望它更聪明。

highlightActiveRoute(array: any[], chosen: string) {
array.forEach(element => {
  element.activated = false;
  if (element.name === chosen) {
    element.activated = true;
    if (element.name === 'journeys' || element.name === 'expenses') {
      this.routes[2].activated = true;
    }
  } 
});

} }

我不确定我是否可以更聪明地编写它,但是也许您可以:)非常感谢您的启发。

2 个答案:

答案 0 :(得分:1)

仅使用ArrayIterators(ECMAScript 2015)。使用以下代码,您不必担心数组中的任何元素是否会更改其位置:

highlightActiveRoute(array: any[], chosen: string) {
array.forEach(element=>{element.activated=false});
if(['journeys','expenses'].includes(chosen))
{  
    array[array.findIndex(element=>{return element.name==='relations'})].activated = true;
    array[array.findIndex(element=>{return element.name==='expenses'})].activated = true;
    array[array.findIndex(element=>{return element.name==='journeys'})].activated = true;
}
else
{
    array[array.findIndex(element=>{return element.name===chosen})].activated = true;
}

return array;
}

答案 1 :(得分:0)

我做了一些小改进。 首先,变量element.activated仅被覆盖一次,而不是在当前代码中覆盖两次。还降低了代码的深度,以使其更具可读性。希望他能对您有所帮助。祝你好运!

highlightActiveRoute(array: any[], chosen: string) {
    array.forEach(element => {
        element.activated = element.name === chosen; 
        if (element.activated 
            && (element.name === 'journeys' || element.name === 'expenses') ) {
                this.routes[2].activated = true;
        } 
    });
}