Javascript нежелательное «пустое» свойство после слияния объектов

1

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

 let mergedProfiles = [];
  for (let set of profiles) {
      if (Object.keys(mergedProfiles).indexOf(String(set.profile_id)) >= 0) { // if profile id exists
          mergedProfiles[set.profile_id].push(set);
      } else {
          mergedProfiles[set.profile_id] = [];
          mergedProfiles[set.profile_id].push(set);
      }
  }

Пример объекта профиля: {user_id: 17, name: "test", country: "US", bid: 0.02, profile_id: "1", user_id: 12}

слияние работает нормально, но по какой-то причине я не могу понять, что я всегда заканчиваю empty как свое первое свойство в mergedProfiles, любую идею, что Imissing?

  • 1
    почему mergedProfiles является массивом? Вы, кажется, используете его в качестве справочной таблицы
  • 0
    Пожалуйста, измените ваш код, нажмите <> и добавьте минимальный воспроизводимый пример
Теги:

2 ответа

3
Лучший ответ

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

var profiles = [{ user_id: 17, name: "test", country: "US", bid: 0.02, profile_id: "1", user_id: 12 }],
    mergedProfiles = {},
    s;

for (s of profiles) {
    if (!mergedProfiles[s.profile_id]) {
        mergedProfiles[s.profile_id] = [];
    }
    mergedProfiles[s.profile_id].push(s);
}

console.log(mergedProfiles);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0

Вы хотите сохранить результаты в объекте, чтобы вы могли ссылаться по ключу.

const allProfiles = {};
for(let set of profiles) {
    if(typeof allProfiles[set.profile_id] === "undefined") {
        allProfiles[set.profile_id] = [set];
    }
    else {
        allProfiles[set.profile_id].push(set);
    }
}

Причина, по которой ваш первый элемент пуст, заключается в том, что вы объявляете пустой массив JavaScript и затем не инициализируете все элементы.

Если вы делаете что-то вроде

var someArray = [];
someArray[5] = 10;
console.log(someArray); // [empty × 5, 5]

то результатом является разреженный массив, в котором первые 5 элементов (0 - 4) являются пустыми или, другими словами, undefined. В вашем примере вы делаете то же самое, что и выше, где ваш profile_id является целым числом больше 0.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню