繁体   English   中英

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

[英]Is it a good pattern to use an Object as an indexed array in JavaScript ES6?

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

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对象当作关联数组使用时的一个问题是,不可能使用方便的数组方法,例如lengthfiltermap等。

因此,改用数组会更好吗?

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方法冲突Object.prototype 如果它们是数字ID,这很容易。

但是,在ES6中,您应该只使用Map 这也使您可以轻松获得尺寸。 不幸的是,它还没有类似数组的辅助方法,但是它与迭代器一起使用时效果很好。

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM