我有一个对象,它有一个属性,它是一个包含(以及其他属性)ID的其他对象的数组。
说像
car = {
id: number
model: string
company: object
}
其中company = {id: number, name: string}
现在,我想添加一家为这款车生产电话号码的公司。但不是所有公司,只针对ID = 5的公司。
我的第一个想法是将company
定义为Map<number, object>()
,但我需要使用数组。什么是实现这一目标的最有效方法。
我在考虑:
filter
按ID indexOf
和splice
从阵列中删除公司2
推回到数组但这个过程看起来有点过于复杂。有更好,更快的方式吗?
答案 0 :(得分:0)
所以,如果我理解正确,car.company
是一个数组,对吧?
您可以直接将新属性添加到数组中的对象。无需提取它然后将其推回阵列。
以下是我的表现方式:
- 使用
map()
将公司对象数组转换为ID。- 使用步骤1中的ID数组
indexOf
查找所需ID的索引。- 将新属性直接设置为步骤2中找到的索引处的对象。
醇>
如果我们从这开始,例如:
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