从一个数组中删除代表另一个数组的重复数据

Posted

技术标签:

【中文标题】从一个数组中删除代表另一个数组的重复数据【英文标题】:From an array remove duplicate data behalf of another array 【发布时间】:2018-12-14 20:16:23 【问题描述】:

我有两个数组,一个是原始数组,第二个是原始数组的副本。我将一些新项目放入一个数组中并更新其中一些,并希望将其与复制数组进行比较,并希望消除复制数组中的那些项目并将这些项目保留在Id = null

 var original = [
    
        "Id": 1,
        "BrandConstruct": 265,
        "YearPlanData": "a"
    ,
       "Id": 2,
        "BrandConstruct": 236,
        "YearPlanData": "c"
    ,
       "Id": 3,
        "BrandConstruct": 376,
        "YearPlanData": "b"
    ,
       "Id": null,
        "BrandConstruct": 476,
        "YearPlanData": "e"
    , 
       "Id": null,
        "BrandConstruct": 576,
        "YearPlanData": "f"
    

]

    var copy = [
    
        "Id": 1,
        "BrandConstruct": 165,
        "YearPlanData": "a"
    ,
       "Id": 2,
        "BrandConstruct": 236,
        "YearPlanData": "c"
    ,
       "Id": 3,
        "BrandConstruct": 376,
        "YearPlanData": "b"
    

]

这是两个具有属性 Id、BrandConstruct、YearPlanData 的数组我添加了新项目,或者可能是多个项目,其中所有项目的 Id = null 和其他属性将有任何数据或可能是重复数据,所以我想消除重复数据使用复制数组但保留 Id = null 的数据 所以我想要这种比较后的结果,它必须在 IE 上工作

    var original = [
    
        "Id": 1,
        "BrandConstruct": 265,
        "YearPlanData": "a"
    ,

       "Id": null,
        "BrandConstruct": 476,
        "YearPlanData": "e"
    , 
       "Id": null,
        "BrandConstruct": 576,
        "YearPlanData": "f"
    

]

【问题讨论】:

这是具体的angularjs问题还是一般的js问题? 我正在使用 Angular1 并使用 handsontable 表插件,所以我从服务器端获取数据并创建一个数组并进行更新,然后再次以数组的形式发送这个表数据所以问题是我不想要那些未更改的行只是新插入和更新的@Brakebien 【参考方案1】:

const newOriginal = original.filter(obj => 
    return !copy.find(copyObj => JSON.stringify(copyObj) === JSON.stringify(obj))
);

这应该适用于 Internet Explorer:

const newOriginal = original.filter(function(obj) 
    return !copy.filter(function(copyObj)  return JSON.stringify(copyObj) === JSON.stringify(obj)).length
);

【讨论】:

它正在工作,但箭头 (=>) 在 IE 上不起作用,因此它在 IE @Nir Berko 上显示错误 谢谢,它在所有浏览器上都能完美运行@Nir Berko 抱歉,这段代码也会在 IE @Nir Berko 上抛出错误 检查我刚刚添加的图片@Nir Berko 如果我使用此代码,那么 在 IE 11 上【参考方案2】:

这可行,但我认为您应该等待更好的解决方案。

var original = [
  "Id": 1,
  "BrandConstruct": 265,
  "YearPlanData": "a"
, 
  "Id": 2,
  "BrandConstruct": 236,
  "YearPlanData": "c"
, 
  "Id": 3,
  "BrandConstruct": 376,
  "YearPlanData": "b"
, 
  "Id": null,
  "BrandConstruct": 476,
  "YearPlanData": "e"
, 
  "Id": null,
  "BrandConstruct": 576,
  "YearPlanData": "f"
];

var copy = [
  "Id": 1,
  "BrandConstruct": 165,
  "YearPlanData": "a"
, 
  "Id": 2,
  "BrandConstruct": 236,
  "YearPlanData": "c"
, 
  "Id": 3,
  "BrandConstruct": 376,
  "YearPlanData": "b"
];
copy = copy.map(function(el) 
  return JSON.stringify(el);
);

original = original.map(function(el) 
  return JSON.stringify(el);
).filter(function(els) 
  return copy.indexOf(els) == -1;
).map(function(s) 
  return JSON.parse(s);
);
console.log(original);

【讨论】:

【参考方案3】:

可以循环遍历original数组,将不属于copy数组的元素推送到新数组中。

function isInArray(item, array) 
  return JSON.stringify(array).indexOf(JSON.stringify(item)) > -1


function getFilteredArray(original, copy) 
  var newOriginal = [];

  for (var i = 0; i < original.length; i++) 
    var item = original[i];
    if (!isInArray(item, copy) || item.id === null) newOriginal.push(item);
  

  return newOriginal;


var original = [
    "Id": 1,
    "BrandConstruct": 265,
    "YearPlanData": "a"
  ,
  
    "Id": 2,
    "BrandConstruct": 236,
    "YearPlanData": "c"
  ,
  
    "Id": 3,
    "BrandConstruct": 376,
    "YearPlanData": "b"
  ,
  
    "Id": null,
    "BrandConstruct": 476,
    "YearPlanData": "e"
  ,
  
    "Id": null,
    "BrandConstruct": 576,
    "YearPlanData": "f"
  

]

var copy = [
    "Id": 1,
    "BrandConstruct": 165,
    "YearPlanData": "a"
  ,
  
    "Id": 2,
    "BrandConstruct": 236,
    "YearPlanData": "c"
  ,
  
    "Id": 3,
    "BrandConstruct": 376,
    "YearPlanData": "b"
  

]

console.log(getFilteredArray(original, copy));

【讨论】:

但我也想保留那些Id = null @phuwin的元素 我编辑了我的答案。我在检查中添加了item的id是否为null,它也会被推送到新的数组中。【参考方案4】:

这是一个对象数组,当没有找到你要搜索的属性的索引时,你可以将它们推入一个空数组,创建一个新的唯一值数组:

   for (var key in array_of_objects) 
     var index = empty_array.findIndex(x => x.attribute == array_of_objects.attribute)
        if (index === -1)
            empty_array.push(d);
        
   

【讨论】:

以上是关于从一个数组中删除代表另一个数组的重复数据的主要内容,如果未能解决你的问题,请参考以下文章

原生JS我打算在把数据存在缓存数组中,再从数组中取出数据在另一个页面取出做表格,怎么不重复添加?

从数组中删除元素(Java)[重复]

NodeJS - 从数组中减去数组,而不是删除所有重复项[重复]

如何从数组中删除数据[重复]

如何从数组中删除重复数据

过滤器数组 - 删除另一个数组中存在的值[重复]