【问题标题】:Remove sub-object-duplicates from an array in Javascript / Typescript从 Javascript / Typescript 中的数组中删除子对象重复项
【发布时间】:2019-10-11 12:21:53
【问题描述】:

我有一个充满对象的数组。几乎所有对象都有不同数量的键值对。其中一些对象具有相同的键值对。

有没有删除所有子对象重复项的好方法? (sub-object-duplicate = 和 all 键值对可以在另一个对象中找到的对象。)

在下面的示例中,例如它将删除所有中间对象,只留下第一个和最后一个。

提前非常感谢:)

我得到的最接近的是使用 here 的这个,但我不知道如何添加 if 条件以仅检查属性是否存在。

通过多个属性(id 和 name)唯一

arr.filter((v,i,a)=>a.findIndex(t=>(t.id === v.id && t.name===v.name))===i)

输入

input = [
  {
    "key0": {
      "key1": "value1",
      "key2": "value1",
      "key3": "value1",
      "key4": "value1",
      "key5": "value1"
    }
  },
  {
    "key0": {
      "key1": "value1",
      "key3": "value1",
      "key5": "value1"
    }
  },
  {
    "key0": {
      "key1": "value1",
      "key2": "value1",
      "key3": "value1"
    }
  },
  {
    "key0": {
      "key1": "value1",
      "key2": "value1",
      "key5": "value1"
    }
  },
  {
    "key0": {
      "key1": "value1",
      "key2": "value2",
      "key3": "value2",
      "key4": "value2",
      "key5": "value2",
      "key6": "value2"
    },
  {
    "key0": {
      "key1": "value2",
      "key2": "value2",
      "key3": "value2",
      "key4": "value2",
      "key5": "value2",
      "key6": "value2"
    }
  }
]

预期输出

output = [
  {
    "key0": {
      "key1": "value1",
      "key2": "value1",
      "key3": "value1",
      "key4": "value1",
      "key5": "value1"
    }
  },
  {
    "key0": {
      "key1": "value2",
      "key2": "value2",
      "key3": "value2",
      "key4": "value2",
      "key5": "value2",
      "key6": "value2",
    }
  }
]

【问题讨论】:

  • 正确地说.. @mplungjan
  • @mplungjan 我试图从这里应用多个东西:stackoverflow.com/questions/2218999/… 但我只能让它工作,如果我事先知道一个对象有哪些键。 : (
  • @mplungjan 我编辑了我尝试过的内容,并且最接近我想要的内容。 ??????
  • 解决方案几乎完成;)

标签: javascript arrays object key


【解决方案1】:

这是一个非常基本的 O(n2) 复杂解决方案:

var input = [
  {
    "key0": {
      "key1": "value1",
      "key2": "value1",
      "key3": "value1",
      "key4": "value1",
      "key5": "value1"
    }
  },
  {
    "key0": {
      "key1": "value1",
      "key3": "value1",
      "key5": "value1"
    }
  },
  {
    "key0": {
      "key1": "value1",
      "key2": "value1",
      "key3": "value1"
    }
  },
  {
    "key0": {
      "key1": "value1",
      "key2": "value1",
      "key5": "value1"
    }
  },
  {
    "key0": {
      "key1": "value1",
      "key2": "value2",
      "key3": "value2",
      "key4": "value2",
      "key5": "value2",
      "key6": "value2"
    }
  },
  {
    "key0": {
      "key1": "value2",
      "key2": "value2",
      "key3": "value2",
      "key4": "value2",
      "key5": "value2",
      "key6": "value2"
    }
  }
];

var isIncluded = function (a, b) {
	for (var key in a) {
  	if (!b[key] || b[key] !== a[key])
    	return false;
  }
  
  return true;
};


var output = [];

for (var i = 0; i < input.length; i++) {
	var toInclude = true;

  for (var j = 0; j < input.length; j++) {
  	if (j === i)
    	continue;
      
    if (isIncluded(input[i].key0, input[j].key0)) {
    	toInclude = false;
      break;
    }
  }
  
  if (!toInclude)
  	continue;
    
  output.push(input[i]);
}

console.log(output);
// document.write(JSON.stringify(output));

请注意,输出有 3 个项目,因为您可能在其中一个对象中犯了错误(混合 value1 和 value2)

【讨论】:

  • 不提供@JilReg 想要的输出
  • 感谢@SimonDehaut 我完全误读了最初的问题——'
  • @guillaumepotier 太棒了,非常感谢!是的,很好,结果应该包含 3 个项目!非常感谢!
【解决方案2】:

这是一个使用 elem 处理每个数组的解决方案,看起来像 {key0:{}},... 到您需要的格式。下面的例子不仅仅处理value1value2:不管是什么值! :)

let input = [ { "key0": { "key1": "value1", "key2": "value1", "key3": "value1", "key4": "value1", "key5": "value1" } }, { "key0": { "key1": "value1", "key3": "value1", "key5": "value1" } }, { "key0": { "key1": "value1", "key2": "value1", "key3": "value1" } }, { "key0": { "key1": "value1", "key2": "value1", "key5": "value1" } }, { "key0": { "key1": "value1", "key2": "value2", "key3": "value2", "key4": "value2", "key5": "value2", "key6": "value2" } }, { "key0": { "key1": "value2", "key2": "value2", "key3": "value2", "key4": "value2", "key5": "value2", "key6": "value2" } } ];

function format(input) {

  let output = input.map(el => Object.keys(el)).map(ell => ell[0]);

  //check if only 'key0' at root key
  let same = output.reduce((acc, curr) => acc == curr ? output[0] : false, output[0]) == output[0];
  if (!same) return;

  //list all possibles value (value1, value2, ...)
  let possibleVal = {};
  for (key in input) {
    for (sub in input[key]['key0']) {
      possibleVal[input[key]['key0'][sub]] = null;
    }
  }
  possibleVal = Object.keys(possibleVal); // make it an array

  // fill output with possible values as key and fill with all possible values
  output = {};
  possibleVal.map(el => output[el] = {});
  input.map(el => {
    Object.entries(el['key0']).map(ell => {
      let key = ell[0];
      let value = ell[1]
      output[value][key] = value;
    });
  });

  // format it correctly and return it
  return possibleVal.map(val => ({
    'key0': output[val]
  }));
}

let final = format(input);

console.log(JSON.stringify(final, null, 4));

【讨论】:

    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 2019-05-21
    • 2016-07-02
    • 1970-01-01
    • 2014-06-25
    • 2017-04-10
    • 1970-01-01
    相关资源
    最近更新 更多