简体   繁体   English

用属性过滤两个json数组

[英]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. SetMap往往对于解决过滤问题非常有用。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM