filter()数组,另一个数组some()不起作用



在下面的方法中,我需要根据第二个数组中是否存在items id来过滤第一个数组。出于某种原因,这对我来说是空的。

dialogRef.afterClosed().subscribe((airlines: AirlineModel[]) => {
console.log(airlines, this.airlines);
const updates = airlines.filter(airline => this.airlines.some(item => item.id === airline.id));
console.log(updates);
});

console.log(airlines, this.airlines);导致:

(13) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
0: {id: "1", code: "AAL", name: "American Airlines"}
1: {id: "6", code: "DAL", name: "Delta Airlines"}
2: {id: "526", code: "SWA", name: "Southwest Airlines"}
3: {id: "27", code: "ASA", name: "Alaska Airlines"}
4: {id: "23", code: "FDX", name: "FedEx"}
5: {id: "205", code: "NCA", name: "Nippon Cargo"}
6: {id: "406", code: "UPS", name: "United Parcel Service"}
7: {id: "160", code: "CPA", name: "Cathay Pacific"}
8: {id: "403", code: "PAC", name: "Polar Air Cargo"}
9: {id: "992", code: "GTI", name: "Atlas Air"}
10: {id: "272", code: "CKS", name: "Kalitta Air"}
11: {id: "345", code: "NAC", name: "Northern Air Cargo"}
12: {id: "615", code: "BCS", name: "European Air Transport"}
length: 13
__proto__: Array(0)
(12) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
0: {id: 6, code: "DAL", name: "Delta Airlines"}
1: {id: 526, code: "SWA", name: "Southwest Airlines"}
2: {id: 27, code: "ASA", name: "Alaska Airlines"}
3: {id: 23, code: "FDX", name: "FedEx"}
4: {id: 205, code: "NCA", name: "Nippon Cargo"}
5: {id: 406, code: "UPS", name: "United Parcel Service"}
6: {id: 160, code: "CPA", name: "Cathay Pacific"}
7: {id: 403, code: "PAC", name: "Polar Air Cargo"}
8: {id: 992, code: "GTI", name: "Atlas Air"}
9: {id: 272, code: "CKS", name: "Kalitta Air"}
10: {id: 345, code: "NAC", name: "Northern Air Cargo"}
11: {id: 615, code: "BCS", name: "European Air Transport"}
length: 12
__proto__: Array(0)

console.log(updates);导致:

[]length: 0__proto__: Array(0)

airlinesid属性是字符串,而this.airlinesid属性是数字。将比较从===(严格(更改为==(抽象(。

请参阅mdn上的相等比较和相同。

const airlines = [{"id":"1","code":"AAL","name":"American Airlines"},{"id":"6","code":"DAL","name":"Delta Airlines"},{"id":"526","code":"SWA","name":"Southwest Airlines"},{"id":"27","code":"ASA","name":"Alaska Airlines"},{"id":"23","code":"FDX","name":"FedEx"},{"id":"205","code":"NCA","name":"Nippon Cargo"},{"id":"406","code":"UPS","name":"United Parcel Service"},{"id":"160","code":"CPA","name":"Cathay Pacific"},{"id":"403","code":"PAC","name":"Polar Air Cargo"},{"id":"992","code":"GTI","name":"Atlas Air"},{"id":"272","code":"CKS","name":"Kalitta Air"},{"id":"345","code":"NAC","name":"Northern Air Cargo"},{"id":"615","code":"BCS","name":"European Air Transport"}];
const thisAirlines = [{"id":6,"code":"DAL","name":"Delta Airlines"},{"id":526,"code":"SWA","name":"Southwest Airlines"},{"id":27,"code":"ASA","name":"Alaska Airlines"},{"id":23,"code":"FDX","name":"FedEx"},{"id":205,"code":"NCA","name":"Nippon Cargo"},{"id":406,"code":"UPS","name":"United Parcel Service"},{"id":160,"code":"CPA","name":"Cathay Pacific"},{"id":403,"code":"PAC","name":"Polar Air Cargo"},{"id":992,"code":"GTI","name":"Atlas Air"},{"id":272,"code":"CKS","name":"Kalitta Air"},{"id":345,"code":"NAC","name":"Northern Air Cargo"},{"id":615,"code":"BCS","name":"European Air Transport"}];
const updates = airlines.filter(airline => 
thisAirlines.some(item => item.id == airline.id)
);
console.log(updates);

您可以使用+-+airlines.id将字符串id转换为数字,也可以使用-String(this.airlines.id将数字转换为字符串,而不用使用抽象等式。

const airlines = [{"id":"1","code":"AAL","name":"American Airlines"},{"id":"6","code":"DAL","name":"Delta Airlines"},{"id":"526","code":"SWA","name":"Southwest Airlines"},{"id":"27","code":"ASA","name":"Alaska Airlines"},{"id":"23","code":"FDX","name":"FedEx"},{"id":"205","code":"NCA","name":"Nippon Cargo"},{"id":"406","code":"UPS","name":"United Parcel Service"},{"id":"160","code":"CPA","name":"Cathay Pacific"},{"id":"403","code":"PAC","name":"Polar Air Cargo"},{"id":"992","code":"GTI","name":"Atlas Air"},{"id":"272","code":"CKS","name":"Kalitta Air"},{"id":"345","code":"NAC","name":"Northern Air Cargo"},{"id":"615","code":"BCS","name":"European Air Transport"}];
const thisAirlines = [{"id":6,"code":"DAL","name":"Delta Airlines"},{"id":526,"code":"SWA","name":"Southwest Airlines"},{"id":27,"code":"ASA","name":"Alaska Airlines"},{"id":23,"code":"FDX","name":"FedEx"},{"id":205,"code":"NCA","name":"Nippon Cargo"},{"id":406,"code":"UPS","name":"United Parcel Service"},{"id":160,"code":"CPA","name":"Cathay Pacific"},{"id":403,"code":"PAC","name":"Polar Air Cargo"},{"id":992,"code":"GTI","name":"Atlas Air"},{"id":272,"code":"CKS","name":"Kalitta Air"},{"id":345,"code":"NAC","name":"Northern Air Cargo"},{"id":615,"code":"BCS","name":"European Air Transport"}];
const updates = airlines.filter(airline => 
thisAirlines.some(item => item.id === +airline.id)
);
console.log(updates);

由于您使用的是typescript,并且您已经多次进行此比较,因此最好创建一组this.airlines字符串ID,并使用该ID进行比较:

const airlines = [{"id":"1","code":"AAL","name":"American Airlines"},{"id":"6","code":"DAL","name":"Delta Airlines"},{"id":"526","code":"SWA","name":"Southwest Airlines"},{"id":"27","code":"ASA","name":"Alaska Airlines"},{"id":"23","code":"FDX","name":"FedEx"},{"id":"205","code":"NCA","name":"Nippon Cargo"},{"id":"406","code":"UPS","name":"United Parcel Service"},{"id":"160","code":"CPA","name":"Cathay Pacific"},{"id":"403","code":"PAC","name":"Polar Air Cargo"},{"id":"992","code":"GTI","name":"Atlas Air"},{"id":"272","code":"CKS","name":"Kalitta Air"},{"id":"345","code":"NAC","name":"Northern Air Cargo"},{"id":"615","code":"BCS","name":"European Air Transport"}];
const thisAirlines = [{"id":6,"code":"DAL","name":"Delta Airlines"},{"id":526,"code":"SWA","name":"Southwest Airlines"},{"id":27,"code":"ASA","name":"Alaska Airlines"},{"id":23,"code":"FDX","name":"FedEx"},{"id":205,"code":"NCA","name":"Nippon Cargo"},{"id":406,"code":"UPS","name":"United Parcel Service"},{"id":160,"code":"CPA","name":"Cathay Pacific"},{"id":403,"code":"PAC","name":"Polar Air Cargo"},{"id":992,"code":"GTI","name":"Atlas Air"},{"id":272,"code":"CKS","name":"Kalitta Air"},{"id":345,"code":"NAC","name":"Northern Air Cargo"},{"id":615,"code":"BCS","name":"European Air Transport"}];
const thisAirlinesSet = thisAirlines.reduce((s, o) => s.add(String(o.id)), new Set);
const updates = airlines.filter(airline => 
thisAirlinesSet.has(airline.id)
);
console.log(updates);

问题是筛选方法使用===运算符,如果不正确,它还会比较变量类型。两个数组都有不同的id类型,this.airlines的id类型为numberairlines的id类型是string。将===运算符替换为==应该可以解决问题

您正在使用"==="进行比较,因此它必须是相同类型的比较!在这种情况下,您可以使用"=="来解决此问题。

const updates = airlines.filter(airline => this.airlines.some(item => +item.id === +airline.id));

您使用的是===,这意味着类型也被检查,所以添加一个+符号将其解析为int和安全检查。

最新更新