【问题标题】:Filtering nested key value pair based on a value provided根据提供的值过滤嵌套键值对
【发布时间】:2018-03-16 21:15:34
【问题描述】:

我是 Angular 的新手,第一次做键值对。我正在尝试根据嵌套键值映射中的特定值获取键值对。我有一个嵌套的 JSON 数据格式:

trips = {
"20180201": [{
        "journeyId": 1001,
        "Number": "001",
        "DriverName": "Alex",
        "Transporter": {
            "id": "T1",
            "number": "AN01001",
            "Company": "Tranzient"
        },
        "place": [{
                "id": 001,
                "value": "Washington DC"
            }]
            [{
                "id": 002,
                "value": "Canberra"
            }]
    }]
    [{
        "journeyId": 1002,
        "Number": "001",
        "DriverName": "Tom",
        "Transporter": {
            "id": "T2",
            "number": "AN01002",
            "Company": "Trax"
        },
        "place": [{
                "id": 002,
                "value": "Canberra"
            }]
            [{
                "id": 004,
                "value": "Vienna"
            }]
    }]
    [{
        "journeyId": 1003,
        "Number": "004",
        "DriverName": "Jack",
        "Transporter": {
            "id": "T3",
            "number": "AN01003",
            "Company": "Trax"
        },
        "place": [{
                "id": 001,
                "value": "Washington DC"
            }]
            [{
                "id": 004,
                "value": "Vienna"
            }]
    }],
"20180211": [{
        "journeyId": 1004,
        "Number": "005",
        "DriverName": "Jack",
        "Transporter": {
            "id": "T3",
            "number": "AN01013",
            "Company": "Trax"
        },
        "place": [{
                "id": 005,
                "value": "Bridgetown"
            }]
            [{
                "id": 006,
                "value": "Ottawa"
            }]
            [{
                "id": 004,
                "value": "Vienna"
            }]

    }]
    [{
        "journeyId": 1005,
        "Number": "005",
        "DriverName": "Jerry",
        "Transporter": {
            "id": "T3",
            "number": "AN01020",
            "Company": "Trax"
        },
        "place": [{
                "id": 005,
                "value": "Bridgetown"
            }]
            [{
                "id": 006,
                "value": "Ottawa"
            }]
    }],
"20180301": [{
    "journeyId": 1006,
    "Number": "005",
    "DriverName": "demy",
    "Transporter": {
        "id": "T3",
        "number": "AN01003",
        "Company": "Trax"
    },
    "place": [{
            "id": 005,
            "value": "Bridgetown"
        }]
        [{
            "id": 006,
            "value": "Ottawa"
        }]
}]};

我正在尝试过滤掉所有具有其 place[value]=Vienna 的 trips 键值对。

我的预期输出应该是:

trips = {
    "20180201": 
        [{
           "journeyId": 1002,
            "Number": "001",
            "DriverName":"Tom",
            "Transporter": {
                "id": "T2",
                "number": "AN01002",
                "Company": "Trax"
            }
            "place": [{"id":002,"value":"Canberra" }]
                      [{"id":004,"value":"Vienna"}]
        }]
        [{
             "journeyId": 1003,
            "Number": "004",
            "DriverName":"Jack",
            "Transporter": {
                "id": "T3",
                "number": "AN01003",
                "Company": "Trax"
            }
            "place": [{"id":001,"value":"Washington DC" }]
                      [{"id":004,"value":"Vienna"}]
        }],
    "20180211": [{
             "journeyId": 1004,
            "Number": "005",
            "DriverName":"Jack",
            "Transporter": {
                "id": "T3",
                "number": "AN01013",
                "Company": "Trax"
            }
            "place": [{"id":005,"value":"Bridgetown" }]
                      [{"id":006,"value":"Ottawa"}]
                      [{"id":004,"value":"Vienna"}]

        }]

};

请帮助我找到正确的方法。我正在尝试以下功能,但卡在中间:

for (var date in trips) {
        var res={}
        for (var index = 0; index < trips[date].length; index++) {
            var data = trips[date][index];

             //rest of the logic here

          }

      }

【问题讨论】:

  • 你能用有效的 json 数据和你当前的代码创建一个小演示吗?
  • 你的意思是说JSON数据无效?
  • 输入 json 无效。在“place”之前缺少,,整个“place”属性都是错误的。
  • 那不是 JSON。这是 JSON:json.org
  • 是的。尝试将 json 数据放入 jsonlint.com 并点击验证。

标签: javascript angular dictionary key-value


【解决方案1】:

您可以使用Array.reduceArray.filterArray.someObject.keys

const filteredTrips = Object.keys(trips).reduce((tmp, x) => {
  const filtered = trips[x].filter(y => y.place.some(z => z.value === 'Vienna'));

  if (filtered.length) {
    tmp[x] = filtered;
  }

  return tmp;
}, {});

const trips = {
  "20180201": [{
      "journeyId": 1001,
      "Number": "001",
      "DriverName": "Alex",
      "Transporter": {
        "id": "T1",
        "number": "AN01001",
        "Company": "Tranzient"
      },
      "place": [{
          "id": 001,
          "value": "Washington DC"
        },
        {
          "id": 002,
          "value": "Canberra"
        }
      ],
    },
    {
      "journeyId": 1002,
      "Number": "001",
      "DriverName": "Tom",
      "Transporter": {
        "id": "T2",
        "number": "AN01002",
        "Company": "Trax"
      },
      "place": [{
          "id": 2,
          "value": "Canberra"
        },
        {
          "id": 4,
          "value": "Vienna"
        }
      ],
    },
    {
      "journeyId": 1003,
      "Number": "004",
      "DriverName": "Jack",
      "Transporter": {
        "id": "T3",
        "number": "AN01003",
        "Company": "Trax"
      },
      "place": [{
        "id": 1,
        "value": "Washington DC",
      }, {
        "id": 4,
        "value": "Vienna",
      }],
    }
  ],
  "20180211": [{
      "journeyId": 1004,
      "Number": "005",
      "DriverName": "Jack",
      "Transporter": {
        "id": "T3",
        "number": "AN01013",
        "Company": "Trax"
      },
      "place": [{
          "id": 5,
          "value": "Bridgetown"
        },
        {
          "id": 6,
          "value": "Ottawa"
        },
        {
          "id": 4,
          "value": "Vienna"
        }
      ],

    },
    {
      "journeyId": 1005,
      "Number": "005",
      "DriverName": "Jerry",
      "Transporter": {
        "id": "T3",
        "number": "AN01020",
        "Company": "Trax"
      },
      "place": [{
          "id": 5,
          "value": "Bridgetown"
        },
        {
          "id": 6,
          "value": "Ottawa"
        }
      ],
    }
  ],
  "20180301": [{
    "journeyId": 1006,
    "Number": "005",
    "DriverName": "demy",
    "Transporter": {
      "id": "T3",
      "number": "AN01003",
      "Company": "Trax"
    },
    "place": [{
        "id": 5,
        "value": "Bridgetown"
      },
      {
        "id": 6,
        "value": "Ottawa"
      }
    ],
  }],
};

const filteredTrips = Object.keys(trips).reduce((tmp, x) => {
  const filtered = trips[x].filter(y => y.place.some(z => z.value === 'Vienna'));

  if (filtered.length) {
    tmp[x] = filtered;
  }

  return tmp;
}, {});

console.log(filteredTrips);

【讨论】:

  • 如果我想满足“place.value”!= undefined 的条件,就在获取 place.value 之前,我应该把它放在哪里。
  • z.value === 'Vienna' 被评估是否值得undefined 它不会匹配。如果你想强制检查你可以做typeof z.value !== 'undefined' &amp;&amp; z.value === 'Vienna'
  • 根据我正在处理的问题,如果我不进行未定义检查,它将抛出错误,无法读取某些未定义。所以它很重要
  • 好的,所以 undefinedplace 而不是 place.value。你可以做y.place &amp;&amp; y.place.some(
【解决方案2】:

你可以试试这个

const expected = {};
for (let date in trips) {
  for (let trip of trips[date]) {
    if (trip.place.map(place => place.value).includes('Vienna')) {
      expected[date] = trips[date];
    }
  }
}

一旦您的对象有效,这应该可以工作。

【讨论】:

  • expected 没有理由成为let,应该是const
  • 在你上面的代码中,如果我必须放一个 if(place.value!== undefined) 的条件语句,我会在哪里做
【解决方案3】:

假设作者只是输入错误的数据。 代码如下:

function getTripsWithPlaceVanillaJS(trips, place) {
    var result = {};

    for (var key in trips) {
        if (trips.hasOwnProperty(key)) {
            var journeys = trips[key];
            var filteredJourneys = [];

            for (var i = 0; i < journeys.length; i++) {
                var journey = journeys[i];

                for (var j = 0; j < journey.place.length; j++) {
                    if (journey.place[i].value === place) {
                        filteredJourneys.push(journey);
                        break;
                    }
                }
            }
            if (filteredJourneys.length) {
                result[key] = filteredJourneys;
            }
        }
    }

    return result;
}

function getTripsWithPlaceSugaredES6(trips, place) {
    return Object.keys(trips).reduce((result, key) => {
        const filteredJourneys = trips[key].filter(journey => journey.place.some(item => item.value === place));

        if (filteredJourneys.length) {
            result[key] = filteredJourneys;
        }
        return result;
    }, {});
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 2012-05-14
    • 2018-05-25
    • 1970-01-01
    相关资源
    最近更新 更多