Как я могу индексировать свойства объекта? - PullRequest
0 голосов
/ 19 марта 2020

У меня есть список объектов, которые содержат имена людей и время их обслуживания. Эти имена могут встречаться более одного раза в этом списке, и время обслуживания может быть разным для каждого случая. То, что я пытаюсь сделать, - это создать HashSet имен с прикрепленным к нему индексом, чтобы я мог ссылаться на него в большом списке без необходимости создания вложенного для l oop. Например, если у меня есть список:

[{Name: 'john doe', ServiceTime: '20min'}, {Name: 'john doe', ServiceTime: '25min'},
 {Name: 'john doe', ServiceTime: '31min'}, {Name: 'billy bob', ServiceTime: '1min'},
 {Name: 'billy bob', ServiceTime: '12min'}, {Name: 'john doe', ServiceTime: '19min'}]

И я создаю свой HashSet, чтобы он выглядел так:

{'john doe': 0, 'billy bob': 1}

Вот как я это делаю:

let count = 0;
 list.map(obj => arr[obj.Name] = arr[obj.Name] ? arr[obj.Name] : count++)

Значение ключа увеличивается каждый раз, когда НОВЫЙ человек найден, если это имеет смысл. После этого я перебираю созданный мной новый объект с именами, чтобы создать массив объектов, в котором будут храниться имена людей и массив для хранения их времени обслуживания, например:

[{Name: 'john doe', ServiceTimes:[]}, {Name: 'billy bob', ServiceTimes:[]}]

С помощью этой информации я могу go вернуться назад и перебрать свой первоначальный список, обновив индекс для поиска по паре ключ-значение моего HashSet следующим образом:

list.map(obj => { 
            let index = arr[obj.Name];

            if(temp[index] !== undefined){
                temp[index].ServiceTimes.push(obj)
            }
        })

Проблема, с которой я сталкиваюсь, что после создания моего HashSet я замечаю, что с индексами у меня происходит ошибка на 1. Например, список, который я предоставил выше, дает мне HashSet:

{'john doe': 1, 'billy bob': 2}

, а с другими списками я получаю HashSet

{'john doe': 0, 'billy bob': 1}

Я, очевидно, хочу, чтобы мой HashSet выглядел как последний один, но не может понять, почему мой счет добавляется дважды в некоторых сценариях ios, а не в других. Если кто-то может указать мне правильное направление или понять, что я могу делать неправильно, что является причиной этой проблемы, я был бы очень признателен. Спасибо!

PS Извините за длинный вопрос.

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Вы можете просто использовать reduce() для перебора массива. И когда вы запускаете редуктор, вы можете делать с ним что угодно. Как показано ниже.

let data = [
 {Name: 'john doe', ServiceTime: '20min'},
 {Name: 'john doe', ServiceTime: '25min'},
 {Name: 'john doe', ServiceTime: '31min'},
 {Name: 'billy bob', ServiceTime: '1min'},
 {Name: 'billy bob', ServiceTime: '12min'},
 {Name: 'john doe', ServiceTime: '19min'}];

let mappedData = data.reduce((accumulator, currentItem, index) => {
      const {Name, ServiceTime} = currentItem;
      if(!accumulator.hasOwnProperty(Name)) {
        accumulator[Name] = {
          firstMatchedAtindex: index,
          count: 0,
          serviceTimes: []
        };
      }

      accumulator[Name].count += 1 ;
      accumulator[Name].serviceTimes.push({index, ServiceTime});
      return accumulator;
      
}, {})

console.log(mappedData);

Простой скрипт ...

let data = [
 {Name: 'john doe', ServiceTime: '20min'},
 {Name: 'john doe', ServiceTime: '25min'},
 {Name: 'john doe', ServiceTime: '31min'},
 {Name: 'billy bob', ServiceTime: '1min'},
 {Name: 'billy bob', ServiceTime: '12min'},
 {Name: 'john doe', ServiceTime: '19min'}];

let mappedData = data.reduce((accumulator, currentItem, index) => {
      const {Name, ServiceTime} = currentItem;
      if(!accumulator.hasOwnProperty(Name)) {
        accumulator[Name] = index;
      }

      return accumulator;
      
}, {})

console.log(mappedData);

Также обратите внимание на массив map Функция обратного вызова предоставит вам доступ к индексу. например,

const list = [
 {Name: 'john doe', ServiceTime: '20min'},
 {Name: 'john doe', ServiceTime: '25min'},
 {Name: 'john doe', ServiceTime: '31min'},
 {Name: 'billy bob', ServiceTime: '1min'},
 {Name: 'billy bob', ServiceTime: '12min'},
 {Name: 'john doe', ServiceTime: '19min'}];

 const transformed = list.map((obj, index) => { 
   return {
     ...obj,
     index
   }
 });
console.log(transformed);

// Same with forEach alternative to for loop
list.forEach((obj, index) => { 
    console.log(obj, index);
 });
 
1 голос
/ 19 марта 2020
let count = 0;
list.map(obj => arr[obj.Name] = arr[obj.Name] ? arr[obj.Name] : count++)

Вы никогда не сбросите переменную count. Вы должны сбросить переменную count при обнаружении нового имени человека.

let data = [
  {Name: 'john doe', ServiceTime: '20min'}, 
  {Name: 'john doe', ServiceTime: '25min'},
 {Name: 'john doe', ServiceTime: '31min'}, 
 {Name: 'billy bob', ServiceTime: '1min'},
 {Name: 'billy bob', ServiceTime: '12min'}, 
 {Name: 'john doe', ServiceTime: '19min'}
];

let final = {};
let found = 0;
data.forEach((obj, index) => {
  if (!final.hasOwnProperty(obj.Name)) {
    final[obj.Name] = found;
    found += 1;

    return;
  }
})

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