Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 更新在另一个对象中使用的对象_Javascript_Angular_Rest_Database Design - Fatal编程技术网

Javascript 更新在另一个对象中使用的对象

Javascript 更新在另一个对象中使用的对象,javascript,angular,rest,database-design,Javascript,Angular,Rest,Database Design,我有一个允许你创建员工的应用程序,但我在重命名员工职位时遇到了一个问题 我有一系列的位置,看起来像这样: positions: [ { id: 1, title: 'Masseuse' }, ... ]; employees: [ { id: 1, name: 'John Doe', title: 'Masseuse' }, ... ]; 如果我创建了一名员工,我必须从下拉列表中选择一个职位,员工最终的样子如下: positions: [ { id: 1, title:

我有一个允许你创建员工的应用程序,但我在重命名员工职位时遇到了一个问题

我有一系列的位置,看起来像这样:

positions: [
  { id: 1, title: 'Masseuse' },
  ...
];
employees: [
  { id: 1, name: 'John Doe', title: 'Masseuse' },
  ...
];
如果我创建了一名员工,我必须从下拉列表中选择一个职位,员工最终的样子如下:

positions: [
  { id: 1, title: 'Masseuse' },
  ...
];
employees: [
  { id: 1, name: 'John Doe', title: 'Masseuse' },
  ...
];
在用户重命名位置之前,此方法可以正常工作。例如,如果用户将“按摩师”重命名为“按摩治疗师”,则职位下拉列表将按预期更新,但拥有该职位的员工仍会说“按摩师”

如果用户重命名某个职位,我是否还需要找到该职位的每位员工并分别更新他们?还是我应该采取不同的方法?我想知道employee对象是否应该存储position ID,因为它永远不会更改,然后以某种方式使用它来显示他们的职位标题,但我不知道这将如何工作

我还没有后端开发或数据库架构方面的经验,所以这可能不是重要信息,但我目前只使用一个假的RESTAPI。我最终将建立一个实际的数据库,但还没有做到这一点

FWIW,我正在使用Angular和以下模拟API:

很好的推理

你的想法是正确的

这与数据库规范化的概念一致,数据库规范化是一种减少体系结构中冗余的结构化方法


Se也维基百科中的数据库规范化

您可以使用职位id来存储标题。然后根据存储的位置id显示标题

employees: [
 { id: 1, name: 'John Doe', titleId: 1 },
 ...
];
那么您的下拉列表如下所示

<select [(ngModel)]="editingEmployee.titleId"">
  <option *ngFor="let x of positions" [value]="x.id">{{x.title}}</option>
</select>
在你的组件中

getPosition(titleId) {
  const position = this.positions.filter(p => p.id === titleId);

  return position[0] ? position[0].title : '';
}

参考本工作指南,一种可能的解决方案是在员工对象中存储职位id而不是头衔

当您需要显示它时,您可以构建该对象的“视图”:

let positions = [
  { id: 1, title: 'Masseuse' },
  ...
];

let employees = [
  { id: 1, name: 'John Doe', positionId: 1 },
  ...
];

function getPositionTittle(id, positions) {
  const position = positions.find(p => p.id === id);

  if (!position) return '';

  return position.title;
}

function prepare(employee, positions) {
  const title = getPositionTittle(employee.positionId, positions);
  return {
    ...employee,
    title
  };
}

const employeeView = prepare(employees[0], positions);
// employeeView = { id: 1, name: 'John Doe', positionId: 1, title: 'Masseuse' }


是的,
employee
对象应该存储position
id
。请参阅关于主键和外键。您确定
位置[titleId]
吗?很抱歉,应该更正,我已更新了答案,谢谢您指出