Массив объектов Как проверить наличие дубликатов текстовых строк с глубоким вложением и удалить их из массива? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть массив объектов. Глубоко внутри этих объектов находится текстовая строка, которую я хочу проверить, имеют ли другие объекты в том же массиве текстовую строку , такую ​​же , / являются дубликатами. Затем мне нужен новый массив с удаленными дубликатами.

Я подумал, что это будет довольно просто, но он проверяет мой интеллект уже два дня.

const arr = [
   {..obj 1}
   {..obj 2}
   {..obj 3}
   {
      id: 4,
      uid: 24872-2847-249249892842,
      tags: ['some', 'stuff'],
      type: "blogpage",
      href: "https://link-to-stuff",
      first_publication_date: "2020-02-12T16:05:04+0000",
      last_publication_date: "2020-02-18T21:52:06+0000",
      data: {
            ...some stuff
                  heading: [
                        { type: "heading1", text: "Here Is My Text I Need To Check Duplicates 
                   Of"}
                  ]
      }

   }
   {..obj 5}
   {..obj 6}
   {..obj 7}
   {..obj 8}
   {..obj 9}
   {..obj 10}
]

I figured something like:

filterOutDuplicates = (blogIndexContent) = > {

let arr = blogIndexContent.pages;

let results = [];

arr.map(each => {
  if (!results || !results.length) {
    results.push(each);
  } else {
    for (let i = 0; i < results.length; i++) {
      const headline = results[i].data.heading[0].text;
      if (headline === each.data.heading[0].text) {
        return;
      } else {
        return results.push(each);
      }
    }
  }
})

console.log('Results :', results); // <-- this just gives me the same 9 blog stories again, no duplicates removed.

}


What am i doing wrong guys?

Ответы [ 4 ]

0 голосов
/ 19 февраля 2020

Это должно работать для вас:

filterOutDuplicates = blogIndexContent => {
  let arr = blogIndexContent.pages

  const result = []
  arr.forEach(each => {
    if (result.length === 0) {
      result.push(each)
    }
    else {
      const headline = each.data.heading[0].text
      let found = false
      for (let i = 0; i < result.length; i++) {
        if (result[i].data.heading[0].text === headline) {
          found = true
          break
        }
      }
      if (!found) {
        result.push(each)
      }
    }
  })

  console.log('Results :', results)
}
0 голосов
/ 19 февраля 2020

Если вы не возражаете против использования loda sh, это можно легко решить с помощью _. UniqBy

const withoutDups = _.uniqBy(arr, 'data.heading[0].text')
0 голосов
/ 19 февраля 2020

Небольшие изменения в вашем коде
1) удалить с помощью map, иметь l oop над массивом.
2) Построить объект uniq с ключами. (Здесь headline - это то, что нам нужно)
3) Добавлять в массив результатов только тогда, когда ключ отсутствует в uniq

let arr = blogIndexContent.pages;

let results = [];

const uniq = {};

for (let i = 0; i < arr.length; i++) {
  const headline = arr[i].data.heading[0].text;
  if (!(headline in uniq)) {
    results.push(each);
    uniq[each] = 1;
  }
}

console.log("Results :", results);
0 голосов
/ 19 февраля 2020

Попробуйте это

const arr = [
  {
    id: 4,
    data: {
      heading: [
        {
          type: "heading1",
          text: "Here Is My Text I Need To Check Duplicates Of"
        }
      ]
    }
  },
  {
    id: 5,
    data: {
      heading: [
        {
          type: "heading1",
          text: "Here Is My Text I Need To Check Duplicates Of"
        }
      ]
    }
  },
  {
    id: 6,
    data: {
      heading: [
        {
          type: "heading1",
          text: "Not Duplicates"
        }
      ]
    }
  }
];

const withoutDuplicates = arr.reduce(
  (prev, curr) =>
    prev
      .map(d => d["data"]["heading"][0]["text"])
      .includes(curr["data"]["heading"][0]["text"])
      ? [curr]
      : [...prev, curr],
  []
);
console.log(withoutDuplicates);

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