Javascript — перебор вложенных объектов

#javascript #arrays #sorting

#javascript #массивы #сортировка

Вопрос:

У меня есть 1 массив с несколькими объектами и объектом. Как мне найти и вернуть данные, соответствующие этому объекту. Вот иллюстрация моего кода.

 const cars = [{model:"honda", color:"black", features:[{title:"fast",speed:"100mph"}]}]

const feature = {id:1,title:"fast",speed:"100mph"} 

const match = cars.filter(car => car.features.includes(feature))     
 

Это должно вернуть

 {model:"honda", color:"black", features:[{title:"fast",speed:"100mph"}]}
 

но это не так, и я не уверен, почему. Может кто-нибудь помочь?

Комментарии:

1. Вы имеете в виду возвращать объект вместо массива?

Ответ №1:

Вы не можете использовать Array.includes для этой цели, поскольку вы не можете сравнить два объекта на равенство (вы получите true только в том случае, если они ссылаются на один и тот же объект). Вместо этого вы могли бы использовать Array.some и Array.every , чтобы увидеть, дублируются ли у какого-либо features объекта все его пары ключ / значение в feature :

 const cars = [{
  model: "honda",
  color: "black",
  features: [{
    title: "fast",
    speed: "100mph"
  }]
}];
const feature = {
  id: 1,
  title: "fast",
  speed: "100mph"
};

const match = cars.filter(car => car.features.some(f => Object.keys(f).every(k => f[k] == feature[k])));

console.log(match); 

Комментарии:

1. Из ожидаемого результата OP это больше похоже find на операцию, чем filter . Хотя я могу ошибаться

2. @Phil Я учел это, но в каждом из массивов and есть только значение cars features , поэтому неясно, даст ли это желаемый результат, поскольку кажется, что у вас может быть другая машина, которая имеет функцию {title:"fast",speed:"100mph"}