【问题标题】:Find differences (with additional objects) between n arrays of objects查找 n 个对象数组之间的差异(带有其他对象)
【发布时间】:2016-10-28 09:19:01
【问题描述】:

我有一个名为 props 的数组,其中包含 n 数量的带有对象的数组,并且所有数组都可以包含不同数量的对象。

每个对象有 4 个属性:participation_enablednamepathing_enabledid,并且这些属性在其他数组中对于相同的属性 id 可以有不同的值...

我有两个目标:
1) 在其他对象数组中找到所有不同的对象属性,并将它们存储在另一个名为 diffs 的数组中;
2) 找到所有在其他数组中找不到的额外对象(唯一的id)并将它们存储在另一个名为extra的数组中。

我的代码成功返回了差异,但它没有返回所有额外的对象...

例子:

[
  [
    {participation_enabled:"false", name:"PropEins", pathing_enabled:"true", id:"prop1"}, 
    {participation_enabled:"false", name:"User Status", pathing_enabled:"false", id:"prop2"}, 
    {participation_enabled:"false", name:"Initial ID", pathing_enabled:"false", id:"prop3"}, 
    {participation_enabled:"false", name:"User ID", pathing_enabled:"false", id:"prop4"}, 
    {participation_enabled:"false", name:"Subdomain3", pathing_enabled:"false", id:"prop20"},
    {participation_enabled:"false", name:"Subdomain4", pathing_enabled:"false", id:"prop21"},
    {participation_enabled:"false", name:"Subdomain5", pathing_enabled:"false", id:"prop22"}
  ], 
  [
    {participation_enabled:"false", name:"PropEins", pathing_enabled:"false", id:"prop1"}, 
    {participation_enabled:"false", name:"Room", pathing_enabled:"false", id:"prop2"}, 
    {participation_enabled:"false", name:"Subdomain", pathing_enabled:"false", id:"prop70"}
  ], 
  [
    {participation_enabled:"true", name:"PropEins", pathing_enabled:"true", id:"prop1"}, 
    {participation_enabled:"true", name:"User Status", pathing_enabled:"true", id:"prop2"}, 
    {participation_enabled:"true", name:"Trackingcode", pathing_enabled:"true", id:"prop3"}, 
    {participation_enabled:"false", name:"User ID", pathing_enabled:"true", id:"prop4"}, 
    {participation_enabled:"false", name:"User ID2", pathing_enabled:"false", id:"prop50"}
  ]
]

对于此示例,diffs 数组应包含:

[
  {id:"prop1", participation_enabled:["false","true"], pathing_enabled:["false","true"], index:0},
  {id:"prop2", participation_enabled:["false","true"], name:["User Status","Room"], participation_enabled:["false","true"], pathing_enabled:["false","true"], index:1},
  {id:"prop3", participation_enabled:["false","true"], name:["Initial ID","Trackingcode"], participation_enabled:["false","true"], pathing_enabled:["false","true"], index:2},
  {id:"prop4", pathing_enabled:["false","true"], index:3}
]

extra 数组应该是:

[
  {participation_enabled:"false", name:"Subdomain3", pathing_enabled:"false", id:"prop20"},
  {participation_enabled:"false", name:"Subdomain4", pathing_enabled:"false", id:"prop21"},
  {participation_enabled:"false", name:"Subdomain5", pathing_enabled:"false", id:"prop22"},
  {participation_enabled:"false", name:"Subdomain", pathing_enabled:"false", id:"prop70"},
  {participation_enabled:"false", name:"User ID2", pathing_enabled:"false", id:"prop50"}
]

这是我的代码:

  var diff = {};
  var extra = [];
  props.forEach(function(val, i){
    if (i == 0) {
      val.forEach(function(v1, ind){
        diff[v1.id] = {};
        diff[v1.id].index = [ind];
        for (var key in v1) {
          diff[v1.id][key] = [v1[key]];
        }
      });
    }
    else {
      val.forEach(function(v1){
        var id = v1.id;
        for (var key in v1) {
          if(diff[id]) {
            diff[id][key].push(v1[key]);
          }
        }
        if(!diff[id]) {
          extra.push(v1);
        }
      });
    }
  });

  for (var key in diff) {
    var nested = diff[key];
    var index = nested.index.pop();
    for (nestedKey in nested) {
      nested[nestedKey] =  underscoreGS._filter(nested[nestedKey], function(item, pos) {
        return nested[nestedKey].indexOf(item) == pos;
      });

      if (nested[nestedKey].length < 2) {delete nested[nestedKey];}

    }
    diff[key].id = key;
    diff[key].index = index
    if (underscoreGS._keys(diff[key]).length < 3) {delete diff[key];}
  }

  diff = underscoreGS._values(diff);
  return [diff, extra];

【问题讨论】:

  • 投反对票的目的是什么?

标签: javascript arrays google-apps-script


【解决方案1】:

这是我实施并有效的解决方案:

var variable = [
  [
    {participation_enabled:"false", name:"PropEins", pathing_enabled:"true", id:"prop1"}, 
    {participation_enabled:"false", name:"User Status", pathing_enabled:"false", id:"prop2"}, 
    {participation_enabled:"false", name:"Initial ID", pathing_enabled:"false", id:"prop3"}, 
    {participation_enabled:"false", name:"User ID", pathing_enabled:"false", id:"prop4"}, 
    {participation_enabled:"false", name:"Subdomain3", pathing_enabled:"false", id:"prop20"},
    {participation_enabled:"false", name:"Subdomain4", pathing_enabled:"false", id:"prop21"},
    {participation_enabled:"false", name:"Subdomain5", pathing_enabled:"false", id:"prop22"}
  ], 
  [
    {participation_enabled:"false", name:"PropEins", pathing_enabled:"false", id:"prop1"}, 
    {participation_enabled:"false", name:"Room", pathing_enabled:"false", id:"prop2"}, 
    {participation_enabled:"false", name:"Subdomain", pathing_enabled:"false", id:"prop70"}
  ], 
  [
    {participation_enabled:"true", name:"PropEins", pathing_enabled:"true", id:"prop1"}, 
    {participation_enabled:"true", name:"User Status", pathing_enabled:"true", id:"prop2"}, 
    {participation_enabled:"true", name:"Trackingcode", pathing_enabled:"true", id:"prop3"}, 
    {participation_enabled:"false", name:"User ID", pathing_enabled:"true", id:"prop4"}, 
    {participation_enabled:"false", name:"User ID2", pathing_enabled:"false", id:"prop50"}
  ]
];
  var diff = {};
  var extra = [];
  var ids = [];
  var unique = [];
  
  variable.forEach(function(val){
    val.forEach(function(v1) {
      ids.push(v1.id);
    });
  })
  ids.filter(function(a){
    if(ids.indexOf(a) == ids.lastIndexOf(a)) {
      unique.push(a);
    }
  });
  variable.forEach(function(val){
    val.forEach(function(v1){
      if(unique.indexOf(v1.id) >= 0) {
        
        extra.push(v1);
      }    
    });
  });
  
  variable.forEach(function(val, i){
    if (i == 0) {
      val.forEach(function(v1, ind){
        diff[v1.id] = {};
        diff[v1.id].index = [ind];
        for (var key in v1) {
          diff[v1.id][key] = [v1[key]];
        }
      });
    }
    else {
      val.forEach(function(v1){
        var id = v1.id;
        for (var key in v1) {
          if(diff[id]) {
            diff[id][key].push(v1[key]);
          }
        }
      });
    }
  });
  
  for (var key in diff) {
    var nested = diff[key];
    var index = nested.index.pop();
    for (nestedKey in nested) {
      nested[nestedKey] =  _.filter(nested[nestedKey], function(item, pos) {
        return nested[nestedKey].indexOf(item) == pos;
      });
      
      if (nested[nestedKey].length < 2) {delete nested[nestedKey];}
      
    }
    diff[key].id = key;
    diff[key].index = index
    if (_.keys(diff[key]).length < 3) {delete diff[key];}
  }
  
  diff = _.values(diff);
  console.log("extra:", extra);
  console.log("diff:", diff);
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"&gt;&lt;/script&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 2021-01-29
    • 2016-12-28
    相关资源
    最近更新 更多