过滤 asMap 计算值维护排序顺序?
Filter asMap computed value maintaining sort order?
使用 Mobx,我试图以 booksSortedIdArray
:
中相同的顺序输出 booksByIdMap
中的书名
class BookStore {
@observable booksSortedIdArray = ["88cd7621", "88cd7624", "88cd7623", "88cd7622"];
@observable booksByIdMap = asMap({
"88cd7621": {
"id": "88cd7621",
"title": "The Secret"
},
"88cd7622": {
"id": "88cd7622",
"title": "The Alchemist"
},
"88cd7623": {
"id": "88cd7623",
"title": "Javascript"
},
"88cd7624": {
"id": "88cd7624",
"title": "PHP"
}
});
@computed get byBookId() {
return this.booksByIdMap.values().filter(b => this.booksSortedIdArray.includes(b.id));
}
}
byBookId
中的 filter
似乎没有保持排序顺序而是输出:
The Secret, The Alchemist, Javascript, PHP
相对于:
The Secret, PHP, Javascript, The Alchemist
这里是fiddle.
如何根据booksSortedIdArray
中id的排序输出标题?
您可以对数组使用 reduce 并尝试 get
映射中的每个键。如果它存在,只需将它添加到结果中。 This way you will get it in order:
class BookStore {
@observable booksSortedIdArray = ["88cd7621", "88cd7624", "88cd7623", "88cd7622"];
@observable booksByIdMap = asMap({
"88cd7621": {
"id": "88cd7621",
"title": "The Secret"
},
"88cd7622": {
"id": "88cd7622",
"title": "The Alchemist"
},
"88cd7623": {
"id": "88cd7623",
"title": "Javascript"
},
"88cd7624": {
"id": "88cd7624",
"title": "PHP"
}
});
@computed get byBookId() {
return this.booksSortedIdArray.reduce((res, el) => {
const book = this.booksByIdMap.get(el);
if(book) {
res.push(book);
}
return res;
}, []);
}
}
使用 Mobx,我试图以 booksSortedIdArray
:
booksByIdMap
中的书名
class BookStore {
@observable booksSortedIdArray = ["88cd7621", "88cd7624", "88cd7623", "88cd7622"];
@observable booksByIdMap = asMap({
"88cd7621": {
"id": "88cd7621",
"title": "The Secret"
},
"88cd7622": {
"id": "88cd7622",
"title": "The Alchemist"
},
"88cd7623": {
"id": "88cd7623",
"title": "Javascript"
},
"88cd7624": {
"id": "88cd7624",
"title": "PHP"
}
});
@computed get byBookId() {
return this.booksByIdMap.values().filter(b => this.booksSortedIdArray.includes(b.id));
}
}
byBookId
中的 filter
似乎没有保持排序顺序而是输出:
The Secret, The Alchemist, Javascript, PHP
相对于:
The Secret, PHP, Javascript, The Alchemist
这里是fiddle.
如何根据booksSortedIdArray
中id的排序输出标题?
您可以对数组使用 reduce 并尝试 get
映射中的每个键。如果它存在,只需将它添加到结果中。 This way you will get it in order:
class BookStore {
@observable booksSortedIdArray = ["88cd7621", "88cd7624", "88cd7623", "88cd7622"];
@observable booksByIdMap = asMap({
"88cd7621": {
"id": "88cd7621",
"title": "The Secret"
},
"88cd7622": {
"id": "88cd7622",
"title": "The Alchemist"
},
"88cd7623": {
"id": "88cd7623",
"title": "Javascript"
},
"88cd7624": {
"id": "88cd7624",
"title": "PHP"
}
});
@computed get byBookId() {
return this.booksSortedIdArray.reduce((res, el) => {
const book = this.booksByIdMap.get(el);
if(book) {
res.push(book);
}
return res;
}, []);
}
}