массив filter () другим массивом some () не работает - PullRequest
0 голосов
/ 29 октября 2018

В следующем методе мне нужно отфильтровать первый массив в зависимости от того, существует ли идентификатор элемента во втором массиве. По некоторым причинам это возвращает пустое для меня, хотя.

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)

Ответы [ 4 ]

0 голосов
/ 29 октября 2018
 const updates = airlines.filter(airline => this.airlines.some(item => +item.id === +airline.id));

Вы используете ===, что означает, что тип также проверяется, поэтому добавьте знак +, чтобы проанализировать его для int и выполнить безопасную проверку.

0 голосов
/ 29 октября 2018

Проблема в том, что в методе фильтра используется оператор ===, который сравнивает также типы переменных, если они верны. Оба массива имеют разные типы идентификаторов, this.airlines имеют идентификаторы типа number, а airlines имеют идентификатор типа string. Замена оператора === на == должна решить вашу проблему

0 голосов
/ 29 октября 2018

Вы используете "===" для сравнения, поэтому это должен быть тип сравнения! В этом случае вы можете использовать «==» для решения этой проблемы.

0 голосов
/ 29 октября 2018

Свойство airlines id является строкой, а свойство this.airlines id является числом. Измените сравнение с === (строго) на == (аннотация).

См. Сравнения равенства и одинаковости на 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);

Вместо использования абстрактного равенства вы можете преобразовать строку id в число с помощью + - +airlines.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);

Поскольку вы используете машинописный текст и делаете это сравнение несколько раз, лучше создать Set из this.airlines строковых идентификаторов, для сравнения используйте диапазон:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...