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浏览器