Удалить дубликаты подобъектов из массива в Javascript / Typescript - PullRequest
0 голосов
/ 11 октября 2019

У меня есть массив, полный объектов. Почти все объекты имеют разное количество пар ключ-значение. Некоторые из этих объектов имеют одинаковые пары ключ-значение.

Есть ли хороший способ удалить все дубликаты подобъектов? (sub-object-duplicate = и объект, чьи all пары ключ-значение могут быть найдены в другом объекте.)

В приведенном ниже примере, например, он удалит все промежуточные объекты и оставиттолько первый и последний.

Заранее большое спасибо:)

Самое близкое, что я получил, это использование из здесь , но я не знаю, как добавитьесли условие проверять только свойство, если оно существует.

Уникальный по нескольким свойствам (идентификатор и имя)

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",
    }
  }
]

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Здесь очень простое 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)

0 голосов
/ 11 октября 2019

Вот решение для обработки каждого массива с elem, выглядит как {key0:{}},... в нужном вам формате. Например, ниже обрабатывают больше, чем просто value1 и value2: независимо от значения! :)

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...