查找并向数组的对象添加属性

时间:2018-01-19 09:53:10

标签: javascript arrays typescript

我有一个对象,它有一个属性,它是一个包含(以及其他属性)ID的其他对象的数组。

说像

car = {
    id: number
    model: string
    company: object
}

其中company = {id: number, name: string}

现在,我想添加一家为这款车生产电话号码的公司。但不是所有公司,只针对ID = 5的公司。

我的第一个想法是将company定义为Map<number, object>(),但我需要使用数组。什么是实现这一目标的最有效方法。

我在考虑:

  1. 使用filter按ID
  2. 查找我的公司
  3. 将新属性添加到上面返回的对象
  4. 使用indexOfsplice从阵列中删除公司
  5. 将对象从2推回到数组
  6. 但这个过程看起来有点过于复杂。有更好,更快的方式吗?

1 个答案:

答案 0 :(得分:0)

所以,如果我理解正确,car.company是一个数组,对吧?

您可以直接将新属性添加到数组中的对象。无需提取它然后将其推回阵列。

以下是我的表现方式:

  
      
  1. 使用map()将公司对象数组转换为ID。
  2.   
  3. 使用步骤1中的ID数组indexOf查找所需ID的索引。
  4.   
  5. 将新属性直接设置为步骤2中找到的索引处的对象。
  6.   

如果我们从这开始,例如:

var car = {
  company: [
    { id: 4, name: 'Lamborghini' },
    { id: 5, name: 'Honda' },
    { id: 6, name: 'Ferrari' }
  ]
}

此功能会为指定的公司ID添加电话号码:

function addPhone (companyID,phoneNumber){

  // Map company array and convert each company object into just ids
  var ids = car.company.map( function(c){ return c.id });

  // Find index of specified id
  var index = ids.indexOf(companyID)

  // Set the phone for the object at the corresponding index found above
  car.company[index].phone = phoneNumber

}

正在运行addPhone(5,'123-456-7890'),结果如下:

var car = {
  company: [
    { id: 4, name: 'Lamborghini' },
    { id: 5, name: 'Honda', phone: '123-456-7890' },
    { id: 6, name: 'Ferrari' }
  ]
}

超紧凑/不可读/单线版(仅适用于它):

car.company[car.company.map(function(c){ return c.id }).indexOf(companyID)].phone = phoneNumber

// ES6
car.company[car.company.map(c => c.id).indexOf(companyID)].phone = phoneNumber