Как отфильтровать результаты по ключам в другом объекте с Angular? - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть объект, который говорит, что он называется this.car, и он выглядит следующим образом и отображается на странице:

this.car = {
    id: 1,
    title: "F40",
    make: ferrari,
    color: red,
    category: fast
};

Затем у меня есть массив результатов поиска для поиска автомобилей, которые возвращаются из конечная точка, которая может выглядеть так:

let uri = `fast-cars/search?make=${make}&color=${color}&title=${title}`;

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

, если мой массив результатов выглядит следующим образом:

this.results = [
    {
      id: 1,
      title: "F40",
      make: ferrari,
      color: red,
      category: fast
    },
    {
      id: 2,
      title: "911",
      make: porsche,
      color: black,
      category: fast
    },
    {
      id: 3,
      title: "Focus",
      make: ford,
      color: yellow,
      category: slow
    },
    {
      id: 4,
      title: "T-Series",
      make: Bentley,
      color: grey,
      category: fast
    }
];

Затем я хочу отфильтровать результаты по значениям в первом объекте, но мой фильтр не работает. то есть id: 1 должен быть удален из выпадающего списка.

Затем я использую этот метод, который вызывается так же в другом месте при подписке на результаты:

results => {
  if (results) {
    this.results = results;
    this.filterSearchResults(this.results, this.car);
  }
}

Я не блестящий с использованием фильтров для нескольких значений, так что попали в блок с точки зрения заставить это работать. Кто-нибудь может увидеть, что я делаю не так?

Ответы [ 4 ]

1 голос
/ 09 апреля 2020

Это удалит объект из массива, если объект автомобиля имеет те же свойства (т. Е. Заголовок, марку и цвет), что и объект, уже присутствующий в массиве:

this.results.filter(
   e => e.title !== car.title && e.make !== car.make && e.color !== car.color
);

Если вы Если вы хотите просто проверить, существует ли объект, вы можете использовать some, который вернет значение логическое , указывающее, существует элемент или нет:

return this.results.some(
   e => e.title === car.title && e.make === car.make && e.color === car.color
);
0 голосов
/ 09 апреля 2020

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

car = {
    id: 1,
    title: "F40",
    make: "ferrari",
    color: "red",
    category: "fast"
};
results = [
    {
      id: 1,
      title: "F40",
      make: "ferrari",
      color: "red",
      category: "fast"
    },
    {
      id: 2,
      title: "911",
      make: "porsche",
      color: "black",
      category: "fast"
    },
    {
      id: 3,
      title: "Focus",
      make: "ford",
      color: "yellow",
      category: "slow"
    },
    {
      id: 4,
      title: "T-Series",
      make: "Bentley",
      color: "grey",
      category: "fast"
    }
];
this.results= this.results.filter(listedcar=> listedcar.id !== this.car.id);
  console.log(this.results)
0 голосов
/ 09 апреля 2020

Если я правильно понял ваш вопрос, вы хотели бы отфильтровать this.car в вашем this.results и отобразить оставшиеся.

filterSearchResults() {
  var filteredList = this.results.filter(cars => cars.id !== this.car.id);
  // or have another global object like this.filteredCars
  console.log(filteredList);
};

Поскольку this.car и this.results являются глобальными объектами, вы можете использовать их непосредственно в функции, передавать не нужно.

0 голосов
/ 09 апреля 2020

Проблема в вашем условном логе c, исправлена ​​ниже. Вам нужно

(result["color"] === car["color"] &&
result["make"] === car["make"] &&
result["title"] === car["title"])

Не

result["color"] && result["make"] && result["title"] ===
car["color"] && car["make"] && car["title"]

const car = {
    id: 1,
    title: "F40",
    make: 'ferrari',
    color: 'red',
    category: 'fast'
};

const results = [
    {
      id: 1,
      title: "F40",
      make: 'ferrari',
      color: 'red',
      category: 'fast'
    },
    {
      id: 2,
      title: "911",
      make: 'porsche',
      color: 'black',
      category: 'fast'
    },
    {
      id: 3,
      title: "Focus",
      make: 'ford',
      color: 'yellow',
      category: 'slow'
    },
    {
      id: 4,
      title: "T-Series",
      make: 'Bentley',
      color: 'grey',
      category: 'fast'
    }
];


          
console.log(results.filter(result => 
  (result["color"] === car["color"] &&
  result["make"] === car["make"] &&
  result["title"] === car["title"])
));
...