javascript - 在 JavaScript ES6 中使用对象作为索引数组是一个好的模式吗?

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

像使用关联数组一样使用 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 方法发生冲突。如果它们是数字 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;
}

关于javascript - 在 JavaScript ES6 中使用对象作为索引数组是一个好的模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31870443/

相关文章:

javascript - 使用 Javascript 推送嵌套数组注释

java - 表示 Java 中两个集合串联的集合

javascript - 将第一个元素聚焦在新行上

javascript - 异步/等待函数返回未定义?

javascript - 为什么在我尝试打印网页时,广告内容没有在每个打印页面中重复出现?

data-structures - 搜索后代的无序列表

algorithm - 找到两个节点(顶点)之间的最短路径

javascript - nodejs fs.writeFile 在发布后失败

php - 递归地将数组键从 underscore_case 转换为 camelCase

javascript - JS 检查 Jquery inArray