在JavaScript ES6中将对象用作索引数组是一种好模式吗?

在JavaScript ES6中将对象用作索引数组是一种好模式吗?,javascript,arrays,data-structures,coding-style,ecmascript-6,Javascript,Arrays,Data Structures,Coding Style,Ecmascript 6,我已经多次看到这种模式: var messages = {}; function addMessage(newMessage) { messages[newMessage.id] = newMessage; } function numUnread() { var unread = 0; for (var id in messages) { if (messages[id]) { unread++; } } return unread; }

我已经多次看到这种模式:

var messages = {};

function addMessage(newMessage) {
  messages[newMessage.id] = newMessage;
}

function numUnread() {
  var unread = 0;
  for (var id in messages) {
    if (messages[id]) {
      unread++;
    }
  }
  return unread;
}
将JavaScript对象当作关联数组使用的一个问题是,不可能使用方便的数组方法,如
length
filter
map
,等等

那么,使用数组会更好吗

let messages = [];

function addMessage(newMessage) {
  const newMessages = messages
      .filter(msg => msg.id !== newMessage.id)
      .push(newMessage);
  messages = newMessages;
}

function numUnread() {
  return messages.filter(msg => !msg.isRead).length();
}

使用对象并没有什么问题,只需确保键不会与
Object.prototype
方法冲突。如果它们是数字ID,这就很容易了

然而,在ES6中,您应该只使用一个。这也允许您轻松获得尺寸。不幸的是,它还没有类似于数组的助手方法,但它在迭代器中工作得很好

const messages = new Map();

function addMessage(newMessage) {
  messages.set(newMessage.id, newMessage);
}

function numUnread() {
  let unread = 0;
  for (let {isRead} of messages.values())
    if (!isRead)
      unread++;
  return unread;
}