如何迭代对象并使用 if 语句检查属性的值

问题描述 投票:0回答:3

我正在尝试过滤一个对象数组中名为“miles”的属性。 它应该比较属性“miles”的值并返回那些仅小于用户英里数的值。 接下来,将属性“city”的值推入一个空数组并返回它。

我无法让它返回城市/国家,因为它只是返回一个空数组。

这是我的代码:

let flights = [{origin: 'AEP', destinations:[{city: 'PARIS', miles: 500}, {city: 'BOLZANO', miles: 200}, {city: 'DUBAI', miles: 400}]}, {origin: 'MXP', destinations: [{city: 'SAINT-TROPEZ', miles:  30}]},{origin: 'AEP', destinations: [{city: 'LISBON', miles: 30}, {city: 'MADRID', miles: 700}, {city: 'NICE', miles: 200}]}]

let user = {
   name: 'Elena',
   miles: 450,
   origin: 'AEP'
}
function closureTrip(flights){
    let list = [];
    let array = [];

        return function(user) {
            for (let i = 0; i < flights.length; i++) {
                if (flights[i].origin === user.origin) {
                    list.push(flights[i].destinations);

                    for (let j = 0; j < list.length; j++){
                        if(list[j].miles <= user.miles){
                            array.push(list[j].city);
                        }
                        return array
                    }
                }
            }
        }
}

我的预期:

closureTrip(flights)(user) => [ 'BOLZANO', 'DUBAI', 'LISBON', 'NICE' ]

我得到的:

closureTrip(flights)(user) => []

javascript arrays if-statement return javascript-objects
3个回答
0
投票

您可以执行以下操作:

  1. 使用
    Array#filter
    获取数组中与用户同源的所有元素。
  2. 使用
    Array#flatMap
    创建一个包含上一步中所有城市的一维数组。
  3. 再次使用
    Array#filter
    只获取英里数不超过用户的城市。
  4. 使用
    Array#map
    只提取那些城市的名称。

let flights = [{origin: 'AEP', destinations:[{city: 'PARIS', miles: 500}, {city: 'BOLZANO', miles: 200}, {city: 'DUBAI', miles: 400}]}, {origin: 'MXP', destinations: [{city: 'SAINT-TROPEZ', miles:  30}]},{origin: 'AEP', destinations: [{city: 'LISBON', miles: 30}, {city: 'MADRID', miles: 700}, {city: 'NICE', miles: 200}]}];
let user = {
   name: 'Elena',
   miles: 450,
   origin: 'AEP'
};
function closureTrip(flights) {
    return user => 
      flights.filter(f => f.origin === user.origin).flatMap(f => f.destinations)
             .filter(o => o.miles <= user.miles).map(o => o.city);
}
console.log(closureTrip(flights)(user));


0
投票

首先,使用过滤器来保持条目的正确来源。然后使用 flatMap 从一个数组中的所有这些条目中获取所有目的地。然后,过滤不太远的目的地。最后,对于每个条目,只返回 city 属性。结果将是一个数组。

let flights = [{origin: 'AEP', destinations:[{city: 'PARIS', miles: 500}, {city: 'BOLZANO', miles: 200}, {city: 'DUBAI', miles: 400}]}, {origin: 'MXP', destinations: [{city: 'SAINT-TROPEZ', miles:  30}]},{origin: 'AEP', destinations: [{city: 'LISBON', miles: 30}, {city: 'MADRID', miles: 700}, {city: 'NICE', miles: 200}]}]

let user = {
   name: 'Elena',
   miles: 450,
   origin: 'AEP'
}

console.log(
  flights.filter(i => i.origin===user.origin)
    .flatMap(i => i.destinations)
    .filter(i => i.miles <= user.miles)
    .map(i => i.city)
)


0
投票
  1. filter
    出发地与用户匹配的航班。
  2. loop
    过滤后的航班和
    filter
    目的地里程小于用户里程的航班。
  3. map
    过滤的目的地,只保留城市。
  4. merge
    传播运算符的结果。

工作演示-

let flights = [{origin: 'AEP', destinations:[{city: 'PARIS', miles: 500}, {city: 'BOLZANO', miles: 200}, {city: 'DUBAI', miles: 400}]}, {origin: 'MXP', destinations: [{city: 'SAINT-TROPEZ', miles:  30}]},{origin: 'AEP', destinations: [{city: 'LISBON', miles: 30}, {city: 'MADRID', miles: 700}, {city: 'NICE', miles: 200}]}];

let user = {
  name: 'Elena',
  miles: 450,
  origin: 'AEP'
}

let result = [];
flights.filter(f => f.origin == user.origin).forEach(f => {
  let r = f.destinations.filter(d => d.miles < user.miles).map(i => i.city)
  result = [...result, ...r]
})

console.log(result)

© www.soinside.com 2019 - 2024. All rights reserved.