Как использовать javascript lodash uniqBy для вложенного атрибута

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

{
   "time": 100,
   "complete" : true,
   "results" : {
       "total": 10,
       "score": 3,
       "results": [ 
           {
           "id" : 123,
           "name": "test123"
            },
            {
           "id" : 123,
           "name": "test4554"
            }
          ]
       }     
 }

Как использовать lodash ._uniqBy для дедупликации результатов на основе уникального ключа results.results.id?

Чтобы уточнить, я бы хотел, чтобы дедуплицированный набор результатов возвращался в исходной структуре объекта, например

 {
   "time": 100,
   "complete" : true,
   "results" : {
       "total": 10,
       "score": 3,
       "results": [ 
           {
           "id" : 123,
           "name": "test123"
            }
          ]
       }     
 }

Благодарность

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

Nina Scholz 26.03.2018 19:06

сделано, см. выше

R111 27.03.2018 13:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
2 035
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете достичь своей цели, просто передав правую часть вашего объекта в функцию _.uniqBy(array, [iteratee=_.identity]).

Следующее, что вам нужно сделать, это «объединить» результат lodash uniqBy и ваш объект. Это немного сложно. Предлагаю вам использовать метод ES6Object.assign() и оператор распространение.

Ознакомьтесь с моим решением. Надеюсь это поможет.

const myObj = {
  "time": 100,
  "complete" : true,
  "results" : {
    "total": 10,
    "score": 3,
    "results": [
      {"id" : 123, "name": "test123"},
      {"id" : 123, "name": "test4554"}
    ]
  }     
};

const uniq = _.uniqBy(myObj.results.results, 'id');
const resultWrapper = Object.assign({}, myObj.results, { results: [...uniq] });
const resultObj = Object.assign({}, myObj, { results: resultWrapper });

console.info( resultObj );
<script src = "https://cdn.jsdelivr.net/npm/[email protected]/lodash.min.js"></script>

Спасибо за предложенное вами исправление. Можно ли вернуть дедуплицированный набор результатов в исходной структуре объекта? например : {"time": 100, "complete": true, "results": {"total": 10, "score": 3, "results": [{"id": 123, "name": "test123" }]}};

R111 27.03.2018 11:37

Вы можете использовать что-то вроде этого

const myObj = {
  time: 100,
  complete : true,
  results : {
    total: 10,
    score: 3,
    results: [
      {id : 123, name: "test123"},
      {id : 123, name: "test4554"}
    ]
  }     
};

_.set(myObj, 'results.results', _.uniqBy(_.get(myObj, 'results.results'), 'id'))
<script src = "https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>

Другие вопросы по теме