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