【问题标题】:filtering the array of objects based on other array of objects根据其他对象数组过滤对象数组
【发布时间】:2021-03-21 07:48:12
【问题描述】:

大家好,我有两个对象数组,如下所示

const selectedCodes = [
  { id: 1, modifiedObject: null, originalObject: {id: 23, name: 'test'}},
  { id: 2, modifiedObject: {id: 24, name: 'test2'}, originalObject: null },
  ....
  ....
];

另一个对象数组,如下所示

const originalCodes = [
  { id: 23, name: 'test' },
  { id: 24, name: 'test2'},
  { id: 25, name: 'test3' },
  { id: 26, name: 'test4' }
];

我正在寻找 originalCodes 应该返回这两项的结果

const originalCodes = [
      { id: 25, name: 'test3' },
      { id: 26, name: 'test4' }
    ];

在这里,我想根据 selectedCodes 数组 modifiedObject/originalObject Id 中可用的 id 过滤 originalCodes 数组的结果,并且每个索引始终只有一个对象,修改后的对象和原始对象都会出现。

任何人都可以让我知道或任何关于如何实现结果的想法,非常感谢提前。

我在下面尝试过

const removedArrays = selectCodes.reduce((acc, item) => {
   console.log(item)// here i need to verify  with other array of objects
},[{}])

【问题讨论】:

  • 请添加您的尝试。
  • 我正在尝试像这样const removedArrays = selectedCodes.reduce((acc) => { console.log(acc) },[{}]) 处理reduce,但无法知道如何遍历其他数组
  • @NinaScholz 我更新了我的问题
  • (嵌套的)对象是否具有相同的对象引用?
  • 嵌套对象看起来和原始对象一样

标签: javascript reactjs object ecmascript-6


【解决方案1】:

它并不完全清楚你在寻找什么。听起来您想找到originalCodes 中不存在的selectedCodes。如果是这样,那么以下内容可能对您有用:

const selectedCodes = [
  { id: 1, modifiedObject: null, originalObject: {id: 23, name: 'test'}},
  { id: 2, modifiedObject: {id: 24, name: 'test2'}, originalObject: null }
];

const originalCodes = [
  { id: 23, name: 'test' },
  { id: 24, name: 'test2'},
  { id: 25, name: 'test3' },
  { id: 26, name: 'test4' }
];

const filteredCodes = originalCodes.filter(function(item) {
  return !(selectedCodes.find(element => (element.originalObject && element.originalObject.id) == item.id) || selectedCodes.find(element => (element.modifiedObject && element.modifiedObject.id) == item.id));
});

console.log(filteredCodes);

【讨论】:

  • 感谢您的建议,我需要完全相反的结果(即)希望得到包含 25 和 26 的对象
  • 已更新。只是通过附加!(不是)来切换逻辑
【解决方案2】:

您可以将对象字符串化为 exclude 对象并过滤 originalCodes

这种方法要求所有对象的所有属性都具有相同的顺序。

const
    selectedCodes = [{ id: 1, modifiedObject: null, originalObject: { id: 23, name: 'test' } }, { id: 2, modifiedObject: { id: 24, name: 'test2' }, originalObject: null }],
    originalCodes = [{ id: 23, name: 'test' }, { id: 24, name: 'test2'}, { id: 25, name: 'test3' }, { id: 26, name: 'test4' }],
    exclude = Object.fromEntries(selectedCodes.map(o => [JSON.stringify(o.originalObject || o.modifiedObject), true])),
    result = originalCodes.filter(o => !exclude[JSON.stringify(o)]);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案3】:

    const selectedCodes=[{id:1,modifiedObject:null,originalObject:{id:23,name:"test"}},{id:2,modifiedObject:{id:24,name:"test2"},originalObject:null}],originalCodes=[{id:23,name:"test"},{id:24,name:"test2"},{id:25,name:"test3"},{id:26,name:"test4"}];
    
    let result = originalCodes.filter(({id}) => 
        !selectedCodes.find(e => 
        (e.originalObject?e.originalObject.id:e.modifiedObject.id) === id ))
    
    
    console.log(result)

    【讨论】:

      【解决方案4】:

      如果想法是过滤掉在originalObjectmodifiedObject 中作为name 属性存在的originalCodes 项目,则解决方案可能很简单:

      const selectedCodes = [{id:1,modifiedObject:null,originalObject:{id:23,name:"test"}},{id:2,modifiedObject:{id:24,name:"test2"},originalObject:null}],
            originalCodes = [{id:23,name:"test"},{id:24,name:"test2"},{id:25,name:"test3"},{id:26,name:"test4"}],
            
            
            result = originalCodes.filter(({id}) => 
                        !selectedCodes.some(({originalObject, modifiedObject}) => {
                          const {id: id1} = (originalObject||{}),
                                {id: id2} = (modifiedObject||{})
                          return id == id1 || id == id2
                        })
                     )
            
      console.log(result)
      .as-console-wrapper{min-height:100%;}

      【讨论】:

      • 谢谢,是否可以在不创建新变量的情况下返回 originalCodes
      • 你在标签中提到了react.js,所以我推测你更喜欢不可变的方法(通常是操纵状态的情况)。但是,如果由于某种原因有额外的变量是一个问题(并且将源变量重新分配给结果数组也不是一个选项),您可能会想出一些 for(..-loop 与 .splice() 的组合,删除那些由上述.some()-method 评估为真。
      猜你喜欢
      • 2020-12-14
      • 2013-10-08
      • 2019-02-13
      • 2018-12-25
      • 2020-10-17
      • 2020-10-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      相关资源
      最近更新 更多