Javascript 在已从对象数组中筛选的对象内添加属性

Javascript 在已从对象数组中筛选的对象内添加属性,javascript,arrays,object,Javascript,Arrays,Object,我有一个对象数组(“客户机”),我将其与另一个名为“合同”的数组进行比较,该数组具有一些出现在“客户机”中的ID 我已经过滤了“客户端”,并且我能够找到哪些对象具有相同的id。但是,我无法在该对象中添加新属性 下面是两个数组的示例 客户: const clients = [{"id":"a0ece5db-cd14-4f21-812f-966633e7be86","name":"Anna","email&qu

我有一个对象数组(“客户机”),我将其与另一个名为“合同”的数组进行比较,该数组具有一些出现在“客户机”中的ID

我已经过滤了“客户端”,并且我能够找到哪些对象具有相同的id。但是,我无法在该对象中添加新属性

下面是两个数组的示例

客户:

const clients = [{"id":"a0ece5db-cd14-4f21-812f-966633e7be86","name":"Anna","email":"annap@quotet.com","role":"user"},
{"id":"e8fd159b-57c4-4d36-9bd7-a59ca13057bb","name":"Jack","email":"jackp@quotet.com","role":"admin"},
{"id":"a3b8d425-2b60-4ad7-becc-bedf2ef860bd","name":"Barnett","email":"barnettp@quotet.com","role":"user"},
{"id":"44e44268-dce8-4902-b662-1b34d2c10b8e","name":"Merrill","email":"merrillp@quotet.com","role":"user"},
{"id":"0178914c-548b-4a4c-b918-47d6a391530c","name":"Whitley","email":"whitleyp@quotet.com","role":"admin"},
{"id":"a74c83c5-e271-4ecf-a429-d47af952cfd4","name":"Lamb","email":"lambbp@quotet.com","role":"user"},
{"id":"55601290-8619-4f54-b831-9c6c26c52b44","name":"Ophelia","email":"opheliap@quotet.com","role":"user"},
{"id":"1470c601-6833-48a4-85b4-ddab9c045916","name":"Jerry","email":"jerryp@quotet.com","role":"user"}];
合同:

const contracts = [{"id":"64cceef9-3a01-49ae-a23b-3761b604800b","amountInsured":"1825.89","inceptionDate":"2016-06-01T03:33:32Z","installmentPayment":true,"clientId":"e8fd159b-57c4-4d36-9bd7-a59ca13057bb"},
{"id":"7b624ed3-00d5-4c1b-9ab8-c265067ef58b","amountInsured":"399.89","inceptionDate":"2015-07-06T06:55:49Z","installmentPayment":true,"clientId":"a0ece5db-cd14-4f21-812f-966633e7be86"},
{"id":"56b415d6-53ee-4481-994f-4bffa47b5239","amountInsured":"2301.98", "inceptionDate":"2014-12-01T05:53:13Z","installmentPayment":false,"clientId":"e8fd159b-57c4-4d36-9bd7-a59ca13057bb"},
{"id":"6f514ec4-1726-4628-974d-20afe4da130c","amountInsured":"697.04", "inceptionDate":"2014-09-12T12:10:23Z","installmentPayment":false,"clientId":"a0ece5db-cd14-4f21-812f-966633e7be86"},
{"id":"25202f31-fff0-481c-acfd-1f3ff2a9bcbe","amountInsured":"2579.16", "inceptionDate":"2016-05-03T04:58:48Z","installmentPayment":false,"clientId":"a0ece5db-cd14-4f21-812f-966633e7be86"},
{"id":"15b4430d-96f8-468e-98c0-3caaf8b0b3b6","amountInsured":"645.65", "inceptionDate":"2016-01-15T02:56:48Z","installmentPayment":true,"clientId":"a0ece5db-cd14-4f21-812f-966633e7be86"},
{"id":"5a72ae47-d077-4f74-9166-56a6577e31b9","amountInsured":"751.67", "inceptionDate":"2015-08-05T04:05:01Z","installmentPayment":true,"clientId":"e8fd159b-57c4-4d36-9bd7-a59ca13057bb"},
{"id":"4a582500-fab6-4efe-ae89-0c9ed750d0c7","amountInsured":"3074.24", "inceptionDate":"2014-06-24T09:21:06Z","installmentPayment":false,"clientId":"a0ece5db-cd14-4f21-812f-966633e7be86"}]
下面的代码将数组“clients”中的id与“contracts”中的id进行比较

过滤代码:

clients.filter((e) => {
    return contracts.some((j) => {
      return e.id === j.clientId
    })
})
它起作用了,结果表明两个客户是拥有合同的。我认为将前一个代码更改为下一个代码将添加与同一客户的合同一样多的项目:

clients.filter((e) => {
        return contracts.some((j) => {
            if (e.id === j.clientId) {
                clients.push(e[j.id] = {
                    "amountInsured": j.amountInsured,
                    "inceptionDate": j.inceptionDate,
                    "installmentPayment": j.installmentPayment
                })
            }
        })
})
但它不起作用。。。 正如您所看到的,我的想法是从数组“contracts”中添加与“clients”具有相同id的对象的属性,以便使用这些属性更新数组“clients”。因为可以有许多具有相同id(clientId)的合同,所以我需要以动态方式添加属性名称(我选择使用合同的id)

我非常感谢你的帮助,
非常感谢

有些应该返回布尔值,因为过滤器返回一个新的数组,类似这样的东西可以工作:

let filteredClients = [];
filteredClients = clients.filter((e) => {
        return contracts.some((j) => {
            if (e.id === j.clientId) {
                e[j.id] = {
                    "amountInsured": j.amountInsured,
                    "inceptionDate": j.inceptionDate,
                    "installmentPayment": j.installmentPayment
                }
                return true;
            }
            return false;
        })
});

console.log(filteredClients); 

如果你有大量的合同和客户,这是非常低效的。对于小数组,它的性能会很好,而且可能会稍微快一些,因为它避免了一些对象初始化,并且在整数索引的同构数组上迭代速度很快。
但是代码非常简短。
如果数组的大小非常大(因此clientId查找可以是O(1)),则可以使用对象映射

(将所有合同放在一个对象下)

for(客户端的常量客户端){
const mycontracts=contracts.filter(c=>c.clientId===client.id)
if(mycontracts.length)
client.contracts=Object.fromEntries(
mycontracts.map({id,clientId,…data})=>[id,data]))
}
console.log(
客户
)

const clients=[{“id”:“a0ece5db-cd14-4f21-812f-966633e7be86”,“name”:“Anna”,“email”:”annap@quotet.com,“角色”:“用户”},
{“id”:“e8fd159b-57c4-4d36-9bd7-a59ca13057bb”,“姓名”:“杰克”,“电子邮件”:”jackp@quotet.com“,“角色”:“管理员”},
{“id”:“a3b8d425-2b60-4ad7-becc-bedf2ef860bd”,“姓名”:“Barnett”,“电子邮件”:”barnettp@quotet.com,“角色”:“用户”},
{“id”:“44e44268-dce8-4902-b662-1b34d2c10b8e”,“姓名”:“美林”,“电子邮件”:”merrillp@quotet.com,“角色”:“用户”},
{“id”:“0178914c-548b-4a4c-b918-47d6a391530c”,“姓名”:“惠特利”,“电子邮件”:whitleyp@quotet.com“,“角色”:“管理员”},
{“id”:“a74c83c5-e271-4ecf-a429-d47af952cfd4”,“姓名”:“兰姆”,“电子邮件”:”lambbp@quotet.com,“角色”:“用户”},
{“id”:“55601290-8619-4f54-b831-9c6c26c52b44”,“姓名”:“奥菲莉亚”,“电子邮件”:”opheliap@quotet.com,“角色”:“用户”},
{“id”:“1470c601-6833-48a4-85b4-ddab9c045916”,“姓名”:“Jerry”,“电子邮件”:”jerryp@quotet.com“,”角色“:”用户“}];
施工合同=[{“id”:“64cceef9-3a01-49ae-a23b-3761b604800b”,“金额保证”:“1825.89”,“接收日期”:“2016-06-01T03:33:32Z”,“分期付款”:真,“客户id”:“e8fd159b-57c4-4d36-9bd7-a59ca13057bb”,
{“id”:“7b624ed3-00d5-4c1b-9ab8-c265067ef58b”,“被保险金额”:“399.89”,“接受日期”:“2015-07-06T06:55:49Z”,“分期付款”:真,“客户id”:“a0ece5db-cd14-4f21-812f-966633e7be86”,
{“id”:“56b415d6-53ee-4481-994f-4bffa47b5239”,“被保险金额”:“2301.98”,“接受日期”:“2014-12-01T05:53:13Z”,“分期付款”:假,“客户id”:“e8fd159b-57c4-4d36-9bd7-a59ca13057bb”,
{“id”:“6f514ec4-1726-4628-974d-20afe4da130c”,“金额”:“697.04”,“接受日期”:“2014-09-12T12:10:23Z”,“分期付款”:假,“客户id”:“a0ece5db-cd14-4f21-812f-966633e7be86”,
{“id”:“25202f31-fff0-481c-acfd-1f3ff2a9bcbe”,“金额被保险”:“2579.16”,“接受日期”:“2016-05-03T04:58:48Z”,“分期付款”:假,“客户id”:“a0ece5db-cd14-4f21-812f-966633e7be86”,
{“id”:“15b4430d-96f8-468e-98c0-3caaf8b0b3b6”,“金额”:“645.65”,“接收日期”:“2016-01-15T02:56:48Z”,“分期付款”:真,“客户id”:“a0ece5db-cd14-4f21-812f-966633e7be86”,
{“id”:“5a72ae47-d077-4f74-9166-56a6577e31b9”,“被保险金额”:“751.67”,“接受日期”:“2015-08-05T04:05:01Z”,“分期付款”:真,“客户id”:“e8fd159b-57c4-4d36-9bd7-a59ca13057bb”,
{“id”:“4a582500-fab6-4efe-ae89-0c9ed750d0c7”,“被保险金额”:“3074.24”,“接受日期”:“2014-06-24T09:21:06Z”,“分期付款”:假,“客户id”:“a0ece5db-cd14-4f21-812f-966633e7be86”]

这应该可以完成以下工作:

for (let j in clients) {
    for (let i in contracts) {
        if(contracts[i].id==clients[j].id){
            clients[j].amountInsured = contracts[i].amountInsured;
            clients[j].inceptionDate = contracts[i].inceptionDate;        
            clients[j].installmentPayment = contracts[i].installmentPayment;
        }
    }
}

Filter返回一个新数组,因此当您将值附加到客户端时,这些值将被分配到未筛选的数组。我明白了,这两件事您都是对的。我没有意识到这可能是低效的。诚然,最好将“合同”添加为一项财产。我不知道flatMap,所以很高兴听到它!但是,我需要这两个客户机位于“客户机”数组中,只需添加属性即可。您认为是否可以使用前面的代码执行此操作,或者我应该以另一种方式执行此操作?考虑到你所说的,我会考虑地图对象。谢谢使用
某些
将不起作用,因为它会在第一次真正匹配时停止。如果您是出于优化的目的而这样做的,那么它只会被优化,因为它没有考虑到所有的合同,这不是您想要的。您希望添加所有匹配的合同。你所要求的实际上更容易。它可以是一个干净的两线循环。我在if语句中添加了一个if语句,所以如果没有合同,它就不会添加合同。