Найти повторяющиеся значения в объектах с помощью Javascript - PullRequest
0 голосов
/ 13 июня 2018

Я пытался решить проблему, которая у меня есть.У меня есть массив с объектами в нем, например:

var array = [
  {
    name: "Steven Smith",
    Country: "England",
    Age: 35
  },
  {
    name: "Hannah Reed",
    Country: "Scottland",
    Age: 23
  },
  {
    name: "Steven Smith",
    Country: "England",
    Age: 35
  },
  {
    name: "Robert Landley",
    Country: "England",
    Age: 84
  },
  {
    name: "Steven Smith",
    Country: "England",
    Age: 35
  },
  {
    name: "Robert Landley",
    Country: "England",
    Age: 84
  }
];

Я хочу получить объекты, которые имеют повторяющиеся значения в них и на основе того, какие значения искать.Т.е. я хочу получить объект, который имеет повторяющиеся значения «имя» и «возраст», но не имеет значения «страна», поэтому я получу:

[
  {
    name: "Steven Smith",
    Country: "England",
    Age: 35
  },
  {
    name: "Steven Smith",
    Country: "England",
    Age: 35
  },
  {
    name: "Robert Landley",
    Country: "England",
    Age: 84
  },
  {
    name: "Steven Smith",
    Country: "England",
    Age: 35
  },
  {
    name: "Robert Landley",
    Country: "England",
    Age: 84
  }
];

Если пытался выполнить

array.forEach(function(name, age){
  if(array.name == name || array.age == age){
    console.log(the result)
}
})

Но это только проверяет, равны ли значения объекта самим себе.

Кто-нибудь может мне помочь?

Ответы [ 4 ]

0 голосов
/ 13 июня 2018

Вот альтернативное решение, которое я укажу на

let array      = getData();                       // sets up data array
let duplicates = array.filter(duplicatesOnly);    // filter out duplicates

console.log( duplicates );                        // output to console



/* ============================================================================= */


// Returns true/false based on a duplicate object being found   
function duplicatesOnly(v1, i1, self) {
  let ndx = self.findIndex(function(v2, i2) {
    // make sure not looking at the same object (using index to verify)
    // use JSON.stringify for object comparison
    return (i1 != i2 && JSON.stringify(v1) == JSON.stringify(v2))
  })
  return i1 != ndx && ndx != -1
}


// Use function hoisting to place trivial code at the bottom of example
function getData() {
  return [{
      name: "Steven Smith",
      Country: "England",
      Age: 35
    },
    {
      name: "Hannah Reed",
      Country: "Scottland",
      Age: 23
    },
    {
      name: "Steven Smith",
      Country: "England",
      Age: 35
    },
    {
      name: "Robert Landley",
      Country: "England",
      Age: 84
    },
    {
      name: "Steven Smith",
      Country: "England",
      Age: 35
    },
    {
      name: "Robert Landley",
      Country: "England",
      Age: 84
    }
  ];
}

Преимущества

  • Сердце кода состоит из 3 строк
  • Код понятен
  • Прост в обслуживании

Затраты

  • Производительность
    • JSON.stringify выполняется на двух объектах на каждой итерации (очень дорого)
    • Сложность: O(N ^ 2) - чем больше массив, тем медленнее он может стать

Примечания


  • JSON.stringify может создатьстрока основана на порядке клавиш, поэтому даже если объекты имеют одинаковые ключи / значения, порядок может быть фактором при сравнении объектов - это может рассматриваться как выгода или стоимость
  • Это примерпри использовании filter и findIndex концентрация была не в том, чтобы сделать его эффективным.Его можно улучшить, используя кеширование и выполняя JSON.stringify один раз или вообще избегая его с помощью чего-то более настраиваемого.
0 голосов
/ 13 июня 2018

Быстрый ответ Я пришел сейчас:

   
let result = [];

for(let item of array)
{
    for(let checkingItem of array)
    {
      if(array.indexOf(item) != array.indexOf(checkingItem) &&
        (item.name == checkingItem.name || item.Age == checkingItem.Age))
      {
        if(result.indexOf(checkingItem) == -1)
        {
          result.push(checkingItem);
        }

      }
   }
}

console.log(result);
0 голосов
/ 13 июня 2018

Попробуйте ниже фрагмент.Он проходит через массив своих элементов (внутренний цикл).1-е if условие проверяет один и тот же элемент (мы не хотим, чтобы это было в выводе), 2-е if соответствует требуемому условию для идентификации любого дублирующего объекта.

var array = [
	{
		name: "Steven Smith",
		Country: "England",
		Age: 35
	},
	{
		name: "Hannah Reed",
		Country: "Scottland",
		Age: 23
	},
	{
		name: "Steven Smith",
		Country: "England",
		Age: 35
	},
	{
		name: "Robert Landley",
		Country: "England",
		Age: 84
	},
	{
		name: "Steven Smith",
		Country: "England",
		Age: 35
	},
	{
		name: "Robert Landley",
		Country: "England",
		Age: 84
	}
];

for(let obj of array){
	for(let ele of array){
		if(obj==ele)
			continue;
		if(ele.name===obj.name && ele.age===obj.age){
			console.log(obj);
			break;
		}
	}
}
0 голосов
/ 13 июня 2018

Вы можете использовать 2 reduce.Первый - это сгруппировать массив.Второй - включить в группу только более 1 элемента.

var array = [{"name":"Steven Smith","Country":"England","Age":35},{"name":"Hannah Reed","Country":"Scottland","Age":23},{"name":"Steven Smith","Country":"England","Age":35},{"name":"Robert Landley","Country":"England","Age":84},{"name":"Steven Smith","Country":"England","Age":35},{"name":"Robert Landley","Country":"England","Age":84}]

var result = Object.values(array.reduce((c, v) => {
  let k = v.name + '-' + v.Age;
  c[k] = c[k] || [];
  c[k].push(v);
  return c;
}, {})).reduce((c, v) => v.length > 1 ? c.concat(v) : c, []);

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...