Как проверить, повторяются ли в массиве объектов два одинаковых свойства одновременно? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть следующий массив объектов:

[
 { 
   homeGate: "gate_0",
   homeTerminal: "1",
   destinationGate: "gate_0",
   destinationTerminal: "2"   
 },
 { 
   homeGate: "gate_0",
   homeTerminal: "1",
   destinationGate: "gate_0",
   destinationTerminal: "3"   
 },
 { 
   homeGate: "gate_1",
   homeTerminal: "1",
   destinationGate: "gate_1",
   destinationTerminal: "2"   
 },
 { 
   homeGate: "gate_1",
   homeTerminal: "2",
   destinationGate: "gate_1",
   destinationTerminal: "3"   
 },
]

, и мне нужно проверить, какие из объектов повторяют значения "homeTerminal" и "destinationTerminal" одновременно. Как мы видим из примера, мне нужно было бы получить первый и третий объекты, которые имеют одинаковое значение в обоих свойствах одновременно.

Я пытался создать карту, но я могу сделать это только с одно значение, и я не знаю, как это сделать, проверяя два значения одновременно. Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Вы можете вычислить поиск / карту с помощью составных ключей, состоящих из полей homeTerminal и destinationTerminal .

Затем используйте этот поиск для поиска повторяющихся элементов.

const lkp = data.reduce((lkp, cur) => {
    const {homeTerminal, destinationTerminal} = cur;
    const key = `${homeTerminal}~~${destinationTerminal}`;

    lkp[key] = lkp[key] || [];

    lkp[key].push(cur);

    return lkp;
}, {});

console.log (lkp);

for (const key in lkp) {
    if (lkp[key].length > 1) 
        console.log ("Duplicate entry", lkp[key])
}
<script>var data = [
 { 
   homeGate: "gate_0",
   homeTerminal: "1",
   destinationGate: "gate_0",
   destinationTerminal: "2"   
 },
 { 
   homeGate: "gate_0",
   homeTerminal: "1",
   destinationGate: "gate_0",
   destinationTerminal: "3"   
 },
 { 
   homeGate: "gate_1",
   homeTerminal: "1",
   destinationGate: "gate_1",
   destinationTerminal: "2"   
 },
 { 
   homeGate: "gate_1",
   homeTerminal: "2",
   destinationGate: "gate_1",
   destinationTerminal: "3"   
 },
]</script>
1 голос
/ 27 апреля 2020

Вы можете reduce массив получить желаемый результат.

var arr = [{
  homeGate: "gate_0",
  homeTerminal: "1",
  destinationGate: "gate_0",
  destinationTerminal: "2"
}, {
  homeGate: "gate_0",
  homeTerminal: "3",
  destinationGate: "gate_0",
  destinationTerminal: "2"
}, {
  homeGate: "gate_1",
  homeTerminal: "1",
  destinationGate: "gate_1",
  destinationTerminal: "2"
}, {
  homeGate: "gate_2",
  homeTerminal: "1",
  destinationGate: "gate_2",
  destinationTerminal: "2"
}, {
  homeGate: "gate_1",
  homeTerminal: "2",
  destinationGate: "gate_1",
  destinationTerminal: "3"
}, {
  homeGate: "gate_1",
  homeTerminal: "3",
  destinationGate: "gate_1",
  destinationTerminal: "2"
}]


var result = arr.reduce((retArr, item) => {
  // condition to avoid duplication
  if (!retArr.includes(item)) {
    var filteredArr = arr.filter((i) => {
      return i.homeTerminal === item.homeTerminal && i.destinationTerminal === item.destinationTerminal;
    });
    if (filteredArr.length > 1) retArr = [...retArr, ...filteredArr];
  }
  return retArr;
}, []);

console.log(result);

reduce метод прототипа Array принимает 2 аргумента:

  1. Функция обратного вызова, которая выполняет каждый элемент массива.
  2. Начальное значение для возвращаемого значения
    1. Это значение должно быть возвращено функцией обратного вызова

Функция обратного вызова в свою очередь принимает 3 аргумента:

  1. return_value (retArr)
  2. элемент массива (item)
  3. индекс не используется

Любая операция может быть выполнена на Элемент массива и результат должны отражаться в return_value (здесь операция Contactenation со значениями спреда)

Подробнее о reduce https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

1 голос
/ 27 апреля 2020
var arr=[
 { 
   homeGate: "gate_0",
   homeTerminal: "1",
   destinationGate: "gate_0",
   destinationTerminal: "2"   
 },
 { 
   homeGate: "gate_0",
   homeTerminal: "1",
   destinationGate: "gate_0",
   destinationTerminal: "3"   
 },
 { 
   homeGate: "gate_1",
   homeTerminal: "1",
   destinationGate: "gate_1",
   destinationTerminal: "2"   
 },
 { 
   homeGate: "gate_1",
   homeTerminal: "2",
   destinationGate: "gate_1",
   destinationTerminal: "3"   
 },
]


var r=[];
    arr.forEach((element,index) => {
        for(let i=index;i<arr.length;i++){
            if(element.homeTerminal==arr[i].homeTerminal&&element.destinationGate==arr[i].destinationGate){
                if(!r.includes(element))r.push(element);
                if(!r.includes(arr[i]))r.push(arr[i]);
            }
        }
    });

это должно работать. Вы получите результат в массиве r

...