[英]Filtering two json arrays with properties
i have to filter first array if the same object is present in second array using type script/ javascript 如果类型为script / javascript的第二个数组中存在相同的对象,我必须过滤第一个数组
here is my arrays 这是我的数组
var students = [{id: 1, name : 'SSS'},
{id: 2, name : 'SSa'},
{id: 3, name : 'SSb'},
{id: 4, name : 'SSc'},
{id: 5, name : 'SSd'}];
var emp = [{id: 1, name : 'SSS'},
{id: 4, name : 'SSc'},
{id: 5, name : 'SSd'}];
Output should be 输出应为
var finalarr = [{id: 2, name : 'SSa'},
{id: 3, name : 'SSb'}]
i have tried below but produces wrong ouputs 我在下面尝试过,但是输出错误
for (let i = 0; i < students.length; i++) {
for (let j = 0; j < emp.length; j++) {
if (students[i].id != emp[j].id) {
finalarr.push(students[i]);
}
}
}
console.log(finalarr);
// below is my actual application code //下面是我的实际应用代码
this.appointmentTypes.filter((data, index) => this.typesData.includes(this.typesData[index].appointmentType.id))
Objects are references to memory locations - they'll never ===
each other unless they reference the same memory location, so includes
won't work. 对象是内存位置的引用-他们永远不会
===
除非它们引用相同的内存位置对方,所以includes
将无法工作。 Iterate over the whole array and test the names and IDs instead: 遍历整个数组并测试名称和ID:
var students=[{id:1,name:'SSS'},{id:2,name:'SSa'},{id:3,name:'SSb'},{id:4,name:'SSc'},{id:5,name:'SSd'}] var emp=[{id:1,name:'SSS'},{id:4,name:'SSc'},{id:5,name:'SSd'}] const finalArr = students.filter(({ id, name }) => !emp.some(exclude => exclude.id === id && exclude.name === name) ); console.log(finalArr);
Your imperative attempt w/ loops fails because you push to final array when finding the first item with a different id. 带循环的命令性尝试失败,因为在找到具有不同ID的第一项时,您将推入最终数组。
It should be like 应该像
var students = [{id: 1, name : 'SSS'}, {id: 2, name : 'SSa'}, {id: 3, name : 'SSb'}, {id: 4, name : 'SSc'}, {id: 5, name : 'SSd'}]; var emp = [{id: 1, name : 'SSS'}, {id: 4, name : 'SSc'}, {id: 5, name : 'SSd'}]; var finalarr = [] for (let i = 0; i < students.length; i++) { let found = false // flag for (let j = 0; j < emp.length && !found; j++) { found = students[i].id === emp[j].id } if (!found) finalarr.push(students[i]) } console.log(finalarr)
But a better option would be to create a Set of ids from the second array. 但是更好的选择是从第二个数组创建一组 ID。
new Set(emp.map(item => item.id))
And the simply filter out all elements of the first array which ids are in the set using filter(item => !set.has(item.id))
new Set(emp.map(item => item.id))
并使用filter(item => !set.has(item.id))
简单地过滤掉ID集中的第一个数组的所有元素
var students = [{id: 1, name : 'SSS'}, {id: 2, name : 'SSa'}, {id: 3, name : 'SSb'}, {id: 4, name : 'SSc'}, {id: 5, name : 'SSd'}]; var emp = [{id: 1, name : 'SSS'}, {id: 4, name : 'SSc'}, {id: 5, name : 'SSd'}]; console.log( students.filter( (set => item => !set.has(item.id))(new Set(emp.map(item => item.id))) ) )
Set
and Map
tend to be great for solving filtration problems. Set
和Map
往往对于解决过滤问题非常有用。
See below for more info 👇 请参阅下面的更多信息👇
// Input. const students = [{id: 1, name : 'SSS'},{id: 2, name : 'SSa'},{id: 3, name : 'SSb'},{id: 4, name : 'SSc'},{id: 5, name : 'SSd'}] const emp = [{id: 1, name : 'SSS'},{id: 4, name : 'SSc'},{id: 5, name : 'SSd'}] // Filter. const filter = (A, B) => { const set = new Set(B.map(JSON.stringify)) return A.filter(x => !set.has(JSON.stringify(x))) } // Output. const output = filter(students, emp) // Proof. console.log(output)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.