【问题标题】:Filtering a json array based on a list of values根据值列表过滤 json 数组
【发布时间】:2023-03-28 05:10:01
【问题描述】:

我是 Angular 2 打字稿的新手,但我遇到了一种情况。 我有一个这种格式的 json 数组

needle json 
[{"empId":100,"orgId":500}
{"empId":201,"orgId":566}]

上面的 json 有一个特定的顺序,我们需要保持这个顺序,同时在另一个 json 数组(Haystack)中寻找它们

Haystack json array
[
{"empCode":21,"fname":"Ashish","Lname":"Shukla"},
{"empCode":22,"fname":"John","Lname":"Mark"},
{"empCode":21,"fname":"Vigil","Lname":"Rocker"},
{"empCode":201,"fname":"Rick","Lname":"Mandez"},
{"empCode":21,"fname":"Erik","Lname":"Francis"},
{"empCode":100,"fname":"Alex","Lname":"Mishra"},
{"empCode":21,"fname":"Feeder","Lname":"Kapoor"},
{"empCode":21,"fname":"Dan","Lname":"Rox"},
{"empCode":21,"fname":"Herb","Lname":"Deen"},
{"empCode":21,"fname":"Nate","Lname":"Diaz"},
{"empCode":21,"fname":"Nick","Lname":"Diaz"},
{"empCode":21,"fname":"Conor","Lname":"Pussy"}
]

现在我需要从 haystack 数组中获取那些 id 与 needle 匹配的值,保持针的顺序

{"empCode":100,"fname":"Alex","Lname":"Mishra"},
{"empCode":201,"fname":"Rick","Lname":"Mandez"}

我已经解决了这个问题,但我想我的解决方案不是最优的,因为我使用了很多循环。有人可以建议我一个好的解决方案吗?

请注意:应在结果 json 中维护员工 ID 的顺序,与针头 json 一样。

非常感谢:)

【问题讨论】:

  • 添加您当前的解决方案
  • 是的,我有一个解决方案,但这不是最佳的。我创建了一个保持 ids 的针数组。现在我迭代 haystack 数组并做一个索引,看看它是否存在于新数组中。为了保持订单有效,我将值作为 Id,行数放在地图中。我知道这不是最佳解决方案,因此发布了它。
  • 我不是问你它是否最优,只是添加它!
  • 所以?您的解决方案在哪里?

标签: json typescript filtering


【解决方案1】:

这应该可以工作

public needle: any;
public hayStack: any;

this.needle = [
{"empId": 100, "orgId": 500},
{"empId": 201, "orgId": 566}
];

this.hayStack = [
{"empCode":21,"fname":"Ashish","Lname":"Shukla"},
{"empCode":22,"fname":"John","Lname":"Mark"},
{"empCode":21,"fname":"Vigil","Lname":"Rocker"},
{"empCode":201,"fname":"Rick","Lname":"Mandez"},
{"empCode":21,"fname":"Erik","Lname":"Francis"},
{"empCode":100,"fname":"Alex","Lname":"Mishra"},
{"empCode":21,"fname":"Feeder","Lname":"Kapoor"},
{"empCode":21,"fname":"Dan","Lname":"Rox"},
{"empCode":21,"fname":"Herb","Lname":"Deen"},
{"empCode":21,"fname":"Nate","Lname":"Diaz"},
{"empCode":21,"fname":"Nick","Lname":"Diaz"},
{"empCode":21,"fname":"Conor","Lname":"Pussy"}
];

const needleEmpId = this.needle.map(item => item.empId);
const hayStackEmpCode = this.hayStack.map(item => item.empCode);

const result = hayStackEmpCode.map((id, index) => {
if (needleEmpId.indexOf(id) != -1) {
  return this.hayStack[index];
}
}).sort().filter(item => (item != undefined));

console.log(result);

结果

0:{empCode: 100, fname: "Alex", Lname: "Mishra"}

1:{empCode: 201, fname: "Rick", Lname: "Mandez"}

【讨论】:

  • 感谢您的评论,我将在明天早上检查并更新,现在在 ist 中评估为时已晚。感谢您的回复。
  • 我尝试使用您的解决方案,但结果为空:( 当我显示 needleEmpId 和 hayStackEmpCode 的值时,这些值是正确的,但结果为空。
  • if (needleEmpId.indexOf(id) != -1) { console.log("matched");返回 this.hayStack[index]; } 匹配永远不会发生很难理解为什么:(
  • 您是否为数组分配了正确的名称?你确定你没有遗漏任何东西吗?除了定义变量的前两行之外,所有这些代码都在构造函数内部,它们在构造函数之外,您是否将其添加到构造函数中?这是一个工作代码(我故意粘贴了控制台结果)。我将尝试为此创建一个有效的 plnk 链接。
  • 是的,我按原样尝试过。它永远不会进入状态。我打印的 ID 和索引都正确,但匹配永远不会发生:-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 2023-03-13
  • 2015-10-02
  • 2020-08-08
  • 1970-01-01
相关资源
最近更新 更多