【问题标题】:Update object from objectlist with next object key使用下一个对象键更新对象列表中的对象
【发布时间】:2023-01-06 23:08:29
【问题描述】:

使用 Javascript 并在我的项目中安装了 lodash。

我的输入如下:

const fields = {
  accountBalance: {
    id: 1,
    field: 'input',
  },
  totalTrades: {
    id: 2,
    field: 'input',
  },
  winRate: {
    id: 3,
    field: 'slider'
  },
  reward: {
    id: 4,
    field: 'input',
  },
  risk: {
    id: 5,
    field: 'slider',
  }
}

我想要的输出:

const fields = {
  accountBalance: {
    id: 1,
    field: 'input',
    nextFieldFocus: 'totalTrades'
  },
  totalTrades: {
    id: 2,
    field: 'input',
    nextFieldFocus: 'reward'
  },
  winRate: {
    id: 3,
    field: 'slider'
  },
  reward: {
    id: 4,
    field: 'input',
    nextFieldFocus: 'accountBalance'
  },
  risk: {
    id: 5,
    field: 'slider',
  }
}

每个对象的字段值可以是“输入”或“滑块”。 每次它更新字段值时,我都会调用一个更新字段的函数(上面的预期输出)。 一个字段是输入的每个字段,用该字段是输入的对象列表的下一个键更新 nextFieldFocus。如果在剩余的顺序中找不到它,请从对象列表的开头重新开始,其中该字段是输入。

我尝试了什么:

const fields = {
  accountBalance: {
    id: 1,
    field: 'input',
  },
  totalTrades: {
    id: 2,
    field: 'input',
  },
  winRate: {
    id: 3,
    field: 'slider'
  },
  reward: {
    id: 4,
    field: 'input',
  },
  risk: {
    id: 5,
    field: 'slider',
  }
}

const keys = Object.keys(fields);

for (let i = 0; i < keys.length; i++) {
  const currentKey = keys[i];
  if (fields[currentKey].field === 'input') {
    let nextKey = keys[i + 1];
    while (nextKey && fields[nextKey].field !== 'input') {
      nextKey = keys[++i % keys.length];
    }
    fields[currentKey].nextFieldFocus = nextKey;
  }
}

console.log(fields);

我面临的问题是,如果找不到下一个对象,其中字段是输入,则 nextFieldFocus 将不会被填充。理想的是它从头开始检查,但我不知道如何。

【问题讨论】:

    标签: javascript object lodash


    【解决方案1】:

    const fields = {
      accountBalance: {
        id: 1,
        field: 'input',
      },
      totalTrades: {
        id: 2,
        field: 'input',
      },
      winRate: {
        id: 3,
        field: 'slider'
      },
      reward: {
        id: 4,
        field: 'input',
      },
      risk: {
        id: 5,
        field: 'slider',
      }
    }
    
    const keys = Object.keys(fields);
    
    for (let i = 0; i < keys.length; i++) {
      const currentKey = keys[i];
      const currentObj = fields[currentKey]
      if (currentObj.field === 'input') {
        for (let j = 0; j < keys.length; j += 1) {
          const nextKey = keys[(i + j + 1) % keys.length];
          const nextObj = fields[nextKey]
          if (nextObj.field !== 'input') continue
          currentObj.nextFieldFocus = nextKey;
          break
        }
      }
    }
    
    console.log(fields);

    【讨论】:

      【解决方案2】:
      const keys = Object.keys(fields);
      
      keys.forEach((field, idx) => {
        if (idx === keys.length - 1) return;
      
        fields[field].nextFieldFocus = keys[idx + 1];
      }) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多