【问题标题】:Getting difference between 2 arrays of objects in JavaScript [duplicate]在JavaScript中获取2个对象数组之间的差异[重复]
【发布时间】:2018-09-23 16:19:06
【问题描述】:

我在互联网上搜索了很多,我认为这将是一个非常简单的任务,但我没有找到任何解决方案

这是我的两个对象数组

第一个数组

[ 
  { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 },
  { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 },
  { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 },
  { id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 },
  { id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 },
  { id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 },
  { id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 } 
] 

第二个数组

[ 
  { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 },
  { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 },
  { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 } 
]

我想得到两个对象数组之间的差异,我想要这样的结果

第一个数组 - 第二个数组 =(第一个数组中存在但第二个数组中不存在的对象数组)

[ { id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 },
  { id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 },
  { id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 },
  { id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 } ]

我尝试了很多方法,比如像这样的过滤器

     let c = existingBillPlans.filter(item => 
!billPlans.some(other => item.x == other.x));

但它给出的是空数组。无法理解我应该做什么。

【问题讨论】:

  • 我们的答案呢?

标签: javascript arrays ecmascript-6 javascript-objects ecmascript-5


【解决方案1】:

你快到了,使用id而不是x

existingBillPlans.filter(item => !billPlans.some(other => item.id == other.id));

演示

var existingBillPlans = [{
    id: 2,
    fees: 10000,
    name: 'Yearly Plan',
    cycle: 12
  },
  {
    id: 3,
    fees: 1500,
    name: 'Two Months Plan',
    cycle: 2
  },
  {
    id: 4,
    fees: 2500,
    name: 'Three Months Plan',
    cycle: 3
  },
  {
    id: 5,
    fees: 3000,
    name: 'Four Months Plan',
    cycle: 4
  },
  {
    id: 181,
    fees: 4000,
    name: 'Five Months Plan',
    cycle: 5
  },
  {
    id: 182,
    fees: 5000,
    name: 'Six Months Plan',
    cycle: 6
  },
  {
    id: 183,
    fees: 6000,
    name: 'Seven Months Plan',
    cycle: 7
  }
]
var billPlans = [{
    id: 2,
    fees: 10000,
    name: 'Yearly Plan',
    cycle: 12
  },
  {
    id: 3,
    fees: 1500,
    name: 'Two Months Plan',
    cycle: 2
  },
  {
    id: 4,
    fees: 2500,
    name: 'Three Months Plan',
    cycle: 3
  }
]
var output = existingBillPlans.filter(item => !billPlans.some(other => item.id == other.id));

console.log(output);

【讨论】:

    【解决方案2】:

    我想你想检查每个对象的属性。

    要检查所有对象的属性,请使用every 方法。

    let first_array = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 }, { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 }, { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 }, { id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 }, { id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 }, { id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 }, { id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 } ], second_array = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 }, { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 }, { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 } ] 
      
    let result = first_array
                  .filter(item => !second_array
                              .find(other => Object.keys(other)
                              .every(prop => item[prop] == other[prop]))
                  );
    console.log(result);

    【讨论】:

      【解决方案3】:

      您可以使用.map() 创建一个ids 数组,然后应用.filter()

      let result = (
        (array, ids) => array.filter(({ id }) => !ids.includes(id)))(a1, a2.map(({ id }) => id)
      );
      

      演示:

      let a1 = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 }, { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 }, { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 }, { id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 }, { id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 },{ id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 },{ id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 } ];
        
      let a2 = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 }, { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 }, { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 } ];
        
      let result = (
        (array, ids) => array.filter(({ id }) => !ids.includes(id)))(a1, a2.map(({ id }) => id)
      );
      
      console.log(result);
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      您也可以像这样使用filter()

      let result = a1.filter(({ id }) => !a2.find(o => o.id == id));
      

      演示:

      let a1 = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 },{ id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 }, { id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 }, { id: 5, fees: 3000, name: 'Four Months Plan', cycle: 4 }, { id: 181, fees: 4000, name: 'Five Months Plan', cycle: 5 },{ id: 182, fees: 5000, name: 'Six Months Plan', cycle: 6 }, { id: 183, fees: 6000, name: 'Seven Months Plan', cycle: 7 } ];
        
      let a2 = [ { id: 2, fees: 10000, name: 'Yearly Plan', cycle: 12 }, { id: 3, fees: 1500, name: 'Two Months Plan', cycle: 2 },{ id: 4, fees: 2500, name: 'Three Months Plan', cycle: 3 } ];
        
      let result = a1.filter(({ id }) => !a2.find(o => o.id == id));
      
      console.log(result);
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

      • 为你的答案投一票。我知道当你写了一个正确的答案而没有人投票时的感觉。
      • @MihaiAlexandru-Ionut 做得好;祝你好运:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      相关资源
      最近更新 更多