我覺得這是 Javascript 的一個晦澀的一面,我根本不知道或理解。
我正在使用 Sequelize 從資料庫中檢索物件陣列。這是一個相對復雜的陣列,如包含關聯。陣列如下所示(已簡化):
[
{
name: '...',
director: '...',
genres: [
{id: 1, name: 'Mystery'},
{id: 2, name: 'Thriller'},
],
},
...
]
我想映射這個陣列,以便genres從這個改變格式:
genres: [
{id: 1, name: 'Mystery'},
{id: 2, name: 'Thriller'},
],
對此:
genres: ['Mystery', 'Thriller'],
所以我做了一些我認為在 Javascript 中很常見的事情:
movies.map((movie) => {
movie.genres = movie.genres.map(g => g.name);
movie.actors = movie.actors.map(a => a.name);
return movie;
});
console.log(JSON.stringify(movies));
但是,一旦列印到控制臺,陣列就完全沒有改變。為了對這個陣列產生預期的效果,我必須在執行操作之前將其轉換為字串并轉換回陣列map(),如下所示:
movies = JSON.parse(JSON.stringify(movies));
movies.map((movie) => {
movie.genres = movie.genres.map(g => g.name);
movie.actors = movie.actors.map(a => a.name);
return movie;
});
console.log(JSON.stringify(movies));
為什么它起作用了?我猜想來回進行這種轉換會從物件中洗掉某些欄位,但我看不出這會對陣列產生什么影響。
編輯:使用其他方法,如Array.from或擴展運算子 ( movies = [...movies]) 不起作用。
uj5u.com熱心網友回復:
我對 Sequelize 不熟悉,但我最好的猜測是,當您運行JSON.parseand時JSON.stringify,您會創建從 Sequelize 回傳的值的副本。當您創建副本時,您的代碼將“擁有”新物件,從而允許應用更改。
uj5u.com熱心網友回復:
如果您的optionsArray論點包含該'IMMUTABLE'選項,則它按設計作業。
如果你想檢查它(不是為了解決任何問題,只是為了感覺更清醒一點),那么你可以通過查看Object.getOwnPropertyDescriptor (movies, 'genres') 回傳的內容來驗證不變性。
在這種情況下,是的,最好創建物件的副本。如果您將其歸因于函式式編程,那么它就是“正確”的方法。從不更改物件而是回傳新物件是函式式編程的基本實踐,并避免了整個類別的編程錯誤。
sean-777 是對的,您可以使用幾個不同的庫或結構化克隆()來克隆它。在你的例子中,我可能會選擇
function getName({name}) { return name; }
function mapName(a) {
a.map(getName);
}
function convertMovie(movie) {
return {
...movie,
genres: mapName(movie.genres),
actors: mapName(movie.actors)
};
}
function convertMovies(movies) {
return movies.map(convertMovie)
}
moviesConverted = convertMovies(movies);
console.log(JSON.stringify(moviesConverted));
uj5u.com熱心網友回復:
您可以使用結構化克隆()方法,該方法使用結構化克隆演算法創建給定值的深度克隆。
演示:
const jsObj = [
{
name: 'alpha',
director: 'beta',
genres: [
{id: 1, name: 'Mystery'},
{id: 2, name: 'Thriller'},
],
}
];
const clonedObj = structuredClone(jsObj);
const modifiedObj = clonedObj.map(obj => {
obj.genres = obj.genres.map(genreObj => genreObj.name)
return obj;
});
console.log(jsObj);
console.log(modifiedObj);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/485900.html
標籤:javascript 节点.js 数组 json 续集.js
上一篇:React道具和組件
下一篇:運行可執行檔案時加載共享庫時出錯
