代码之家  ›  专栏  ›  技术社区  ›  Santhosh

筛选两个具有属性的JSON数组

  •  0
  • Santhosh  · 技术社区  · 7 年前

    如果第二个数组中存在相同的对象,我必须使用script/javascript类型筛选第一个数组

    这是我的阵列

    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 = [{id: 2, name : 'SSa'},
    {id: 3, name : 'SSb'}]
    

    我在下面试过了,但出了错误的输出

    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);
    

    //以下是我的实际应用程序代码

    this.appointmentTypes.filter((data, index) => this.typesData.includes(this.typesData[index].appointmentType.id))
    
    3 回复  |  直到 7 年前
        1
  •  5
  •   CertainPerformance    7 年前

    对象是对内存位置的引用-它们永远不会 === 除非它们引用相同的内存位置,所以 includes 不起作用。迭代整个数组并测试名称和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);
        2
  •  1
  •   Yury Tarabanko    7 年前

    您的强制W/Loops尝试失败,因为当您查找具有不同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'}];
    
    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)

    但更好的选择是创建一个 Set 第二个数组中的ID。 new Set(emp.map(item => item.id)) 简单地过滤出第一个数组中ID在集合中的所有元素,使用 filter(item => !set.has(item.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)))
      )
    )
        3
  •  0
  •   Arman Charan    7 年前

    Set Map 对解决过滤问题很有帮助。

    更多信息见下文

    // 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)