Почему пустой массив при объединении значений?

var arr = [];
data = [
  {id: 1, base: "Yes", name: "Test 1"},
  {id: 2, base: "No", name: "Test 2"},
  {id: 2, base: "Yes", name: "Test 3"},
  {id: 4, base: "No", name: "Test 4"},
];
$.each(data, function(i, item){
  if(arr[item.base]) arr[item.base].push(item.name);
  else arr[item.base] = [];
});
console.log(arr);
console.log(arr.length);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Нужен примерно такой результат

[
  "Yes" [
    "Test 1",
    "Test 3"
  ],
  "No" [
    "Test 2",
    "Test 4"
  ]
]

Ответы (1 шт):

Автор решения: Grundy

Свойство массива length меняется только при добавлении/удалении ключей, которые могут быть допустимыми индексами, а именно целочисленные значения от 0 до 232

В данном случае в массив добавляются строковые ключи, которые не влияют на свойство length.

В данном случае arr нужно заменить на объект, тогда и вывод будет ожидаемым:

var arr = {};
data = [{
    id: 1,
    base: "Yes",
    name: "Test 1"
  },
  {
    id: 2,
    base: "No",
    name: "Test 2"
  },
  {
    id: 2,
    base: "Yes",
    name: "Test 3"
  },
  {
    id: 4,
    base: "No",
    name: "Test 4"
  },
];
$.each(data, function(i, item) {
  if (arr[item.base]) arr[item.base].push(item.name);
  else arr[item.base] = [item.name];
});
console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

→ Ссылка