Javascript 如何循环通过嵌套的键值对并基于数组值对其进行筛选

Javascript 如何循环通过嵌套的键值对并基于数组值对其进行筛选,javascript,dictionary,key-value,Javascript,Dictionary,Key Value,我有一个从用户输入构建的数组。我试图循环遍历嵌套的键值对,并检查其中的值是否与给定数组的任何值匹配。目的是建立一个搜索工具 我的阵列: FilteredSelectedOptions=["20180211","Trax","Vienna","AN01020"] 我的键值对是: trips = { "20180201": [{ "journeyId": 1001, "Number": "001", "DriverName": "Alex", "

我有一个从用户输入构建的数组。我试图循环遍历嵌套的键值对,并检查其中的值是否与给定数组的任何值匹配。目的是建立一个搜索工具

我的阵列:

FilteredSelectedOptions=["20180211","Trax","Vienna","AN01020"]
我的键值对是:

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"
      }
    ],
  }],
};
我希望输出如下:

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"}]

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

};
我试图使用for循环来检查每个数组元素与键值对之间的关系。我想做的基本上是

for (option in FilteredselectedOptions) 
{
     //logic
}
我已经能够为一个特定的数组值执行此操作:

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

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

  return tmp;
}, {});

但是,无论数组中有多少个元素,如何对所有数组元素执行此操作。请在循环中提供帮助。

可以使用递归搜索对象中的值:

 function hasValue(obj, values){
  for(const value of Object.values(obj)){
    if(typeof value === "object"){
       if(hasValue(value, values))
          return true;
    } else {
       if(values.includes(value))
          return true;
    }
  }
  return false;
 }
现在,我们可以通过比较钥匙和使用上述功能来过滤您的行程:

  const filteredTrips = Object.keys(trips).filter(key => {
    if(FilteredSelectedOptions.includes(key))
       return true;
    if(hasValue(trips[key], FilteredSelectedOptions))
       return true;
    return false;
 });

如果您需要完整的代码,请告诉我。
首先,javascript中的对象没有内置的过滤器或reduce方法,只有数组有。我要做的是,循环遍历对象属性,即数组,并检查它们是否具有在FilteredSelectedOptions中找到的属性之一。如果我找到一个,我会将它推送到一个包含结果的新数组。

这只是一种尝试通过在数据中查找单个项进行筛选的方法

函数过滤器(对象、选项){
const check=v=>选项。包括(v)| | v&&typeof v=='object'&&object.key(v)。一些(l=>check(v[l]);
var result={};
Object.keys(对象).forEach(函数(k){
var temp=选项。包括(k)
?对象[k]
:对象[k]。过滤器(检查);
if(温度长度){
结果[k]=温度;
}
});
返回结果;
}
var trips={“20180201”:[{journeyId:1001,编号:“001”,司机姓名:“Alex”,运输员:{id:T1,编号:“AN01001”,公司:“Tranzient”},地点:[{id:001,编号:“华盛顿特区”},{id:002,编号:“堪培拉”},{journeyId:1002,编号:“001”,司机姓名:“Tom”,运输员:{id:T2,编号:“AN01002”,公司:“Trax”},地点:{id:2,数值:“堪培拉”},{id:4,数值:“维也纳”},{journeyId:1003,编号:“004”,司机姓名:“杰克”,运输员:{id:T3,编号:“AN01003”,公司:“特拉克斯”},地点:[{id:1,数值:“华盛顿特区”},{id:4,数值:“维也纳”},{20180211:[{journeyId:1004,编号:“005”,司机姓名:“杰克”,运输员:{id:“T3”,编号:“AN01013”,公司:“Trax”},地点:[{id:5,数值:“Bridgetown”},{id:6,数值:“Ottawa”},{id:4,数值:“Vienna”},{journeyId:1005,数值:“005”,司机姓名:“Jerry”,运输员:{id:T3,编号:“AN01020”,公司:“Trax”},地点:[{id:5,数值:“Bridgetown Bridgetown”},{id:6,数值:“Ottawa”}],“20180301”:[{journeyId:1006,编号:“005”,司机姓名:“demy”,运输员:{id:T3,编号:“AN01003”,公司:“Trax”},地点:[{id:5,价值:“布里奇敦”},{id:6,价值:“渥太华”}]},
选项=[“20180211”、/*“Trax”、*/“Vienna”、“AN01020”];
console.log(过滤器(行程、选项));

.as控制台包装{最大高度:100%!重要;顶部:0;}
如果您能为我提供一些代码,肯定会有所帮助。数组中的选项可能是任何嵌套级别。如何正确排序筛选值是否有相关键?筛选值是以数组的形式存在的。如何使用相关键保留它们?这是个问题。这是您的数据,背后的逻辑是什么?第一个值是键,b但并不是所有的关键项目都被采用,
'Trax'
几乎在每一个项目中,
'Vienna'
是可靠的,但不是最后一部分
'AN01020'
在结果集中找不到。那么:为什么呢?逻辑是如果我需要搜索日期为“20180211”的旅行,地点是“Vienna”,transporter.company=“Trax”“and Transporter.number=“AN01020”。最好的方法是什么?所以您有值的关联键?在“for(Object.values(obj))行中,错误:组件类型上不存在值。我遗漏了什么?错误是:“ObjectConstructor类型上不存在属性值”成功了。还是犯同样的错误。我有遗漏吗library@UDGogs你用的是哪个浏览器?我用的是chrome浏览器