Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 国产高清精品入口91,国产免费美女,www.色综合

          整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          第33屆金雞獎報名標(biāo)準(zhǔn)詳細(xì) 2020金雞獎表演類單項

          第33屆金雞獎報名標(biāo)準(zhǔn)詳細(xì) 2020金雞獎表演類單項獎參評要求

          三十三屆中國電影金雞獎公布評選標(biāo)準(zhǔn)。其中,參評編劇獎需注明是原創(chuàng)或改編。參評表演類單項獎(最佳男主角、最佳女主角、最佳男配角、最佳女配角)者,所飾角色的臺詞須由演員本人配音。報名日期為即日起至2020年8月15日。

          全文如下:

          各電影制片機構(gòu):

          根據(jù)《中國電影金雞獎評獎?wù)鲁獭泛汀吨袊娪敖痣u獎評選細(xì)則》有關(guān)規(guī)定,現(xiàn)就報送參評第三十三屆中國電影金雞獎有關(guān)事項通知如下:

          一、獎項設(shè)置

          本屆金雞獎作品獎設(shè)最佳故事片、最佳中小成本故事片、最佳兒童片、最佳紀(jì)錄/科教片、最佳戲曲片、最佳美術(shù)片、最佳外語片。

          本屆金雞獎單項獎設(shè)最佳編劇、最佳導(dǎo)演、最佳男主角、最佳女主角、最佳男配角、最佳女配角、最佳攝影、最佳美術(shù)、最佳音樂、最佳錄音、最佳剪輯、最佳導(dǎo)演處女作獎。

          二、報名范圍

          (一)2019年7月1日至2020年6月30日取得國家電影局核發(fā)的電影片公映許可證的故事片、兒童片、科教片、紀(jì)錄片、戲曲片、美術(shù)片,符合下列條件之一者可報送參評本屆金雞獎作品獎:

          1.內(nèi)地(大陸)電影制片機構(gòu)拍攝的影片;

          2.內(nèi)地(大陸)電影制片機構(gòu)與港澳臺電影制片機構(gòu)合作拍攝的影片;

          3.內(nèi)地(大陸)電影制片機構(gòu)與外國電影制片機構(gòu)合作拍攝的影片;

          4.經(jīng)國家電影局審查通過在內(nèi)地(大陸)發(fā)行的港澳臺影片(不含港澳臺電影制片機構(gòu)與外國電影制片機構(gòu)合作拍攝的影片)。

          (二)上述條款所述影片中申報單項獎?wù)撸毦哂兄腥A人民共和國國籍。

          三、報名程序

          中國電影金雞獎的評獎為每年評選一次,報名日期為即日起至2020年8月15日。

          各制片單位報名參評可直接將所需報送材料快遞至中國電影家協(xié)會金雞獎辦公室,有關(guān)參評表格請在中國文藝網(wǎng)(https://www.cflac.org.cn/zgwl/wlgg/202007/t20200725_488304.html)下載。

          材料寄送地址:北京市朝陽區(qū)北三環(huán)東路22號中國電影家協(xié)會310室

          收件人:中國影協(xié)金雞獎辦公室

          郵 編:100013

          電 話:010-64296094

          四、報名材料

          報送材料包括以下內(nèi)容:

          (一)紙質(zhì)資料:

          1.25套紙質(zhì)報名資料

          (1)國家電影局頒發(fā)的《電影片公映許可證》復(fù)印件;

          (2)參評人(單位)承諾書;

          (3)中國電影金雞獎參評影片申報表、參評單項申報表。

          報名紙質(zhì)材料(A4規(guī)格)以影片為單位(包括《電影片公映許可證》復(fù)印件、參評人(單位)承諾書、影片申報表、單項申報表及需詳細(xì)推薦的材料)裝訂成冊。第一張為《電影片公映許可證》復(fù)印件,第二張為參評人(單位)承諾書,第三張為影片報名表,后面為各單項報名表,裝訂為一套。其中一套為原件,需逐項加蓋申報單位紅色公章,其余24套為該套的復(fù)印件。

          2.申報參評最佳編劇獎?wù)撸杼峁╇娪拔膶W(xué)劇本一式兩份(無水印)。

          (二)電子版資料:

          1.中國電影金雞獎參評影片申報表和參評單項申報表(doc或docx格式);

          2.高清圖片:包括影片海報1張以上、劇照3-5張、參評單項者的照片(個人劇照、工作照、藝術(shù)照均可)1-2張;

          3.簡要故事梗概(300字以內(nèi),doc或docx格式);

          4.申報參評最佳編劇獎?wù)撸杼峁╇娪拔膶W(xué)劇本(doc或docx格式,無水印)。

          上述所有電子版資料請刻在光盤上,報名時光盤隨紙質(zhì)資料和其它資料一并寄給金雞獎辦公室。

          (三)其他資料:

          1.影片2K開口無密鑰數(shù)字硬盤(要求有龍標(biāo)無水印);

          2.影片DVD光盤(全片,要求有龍標(biāo)無水印);

          3.影片高清片花:含片名、單項獎報名者鏡頭(不超過5分鐘,mp4格式),可含拍攝花絮(不超過3分鐘,mp4格式)。請將片花存儲在移動硬盤中,與其它報名資料一起寄給金雞獎辦公室,使用完畢后將予以歸還。

          五、注意事項

          (一)請各申報機構(gòu)和審核單位本著實事求是的精神,嚴(yán)格篩選、擇優(yōu)申報。

          (二)參評作品獎的影片,須認(rèn)真填寫影片參評申報表中所列各項,出品單位名稱及其排序、數(shù)量應(yīng)與公映許可證一致,如有不一致的特殊情況,如公司改名或某家出品方不參評等情況,需要出具加蓋公章的說明。創(chuàng)作人員名稱及其排序應(yīng)與影片字幕一致,如有特殊情況,需出具加蓋公章的說明。

          (三)如報名單項獎的一個獎項有多人,需每人填寫一張報名表,并注明順序。

          (四)參評編劇獎需注明是原創(chuàng)或改編。

          (五)參評表演類單項獎(最佳男主角、最佳女主角、最佳男配角、最佳女配角)者,所飾角色的臺詞須由演員本人配音。

          (六)參評最佳中小成本故事片(候選作品要求投資為低于1000萬人民幣的故事片),必須標(biāo)明影片制作成本。

          (七)最佳導(dǎo)演與最佳導(dǎo)演處女作獎只能選擇一個進行申報。最佳導(dǎo)演處女作獎要求是該導(dǎo)演獨立執(zhí)導(dǎo)的第一部影片。

          (八)最佳故事片、最佳中小成本故事片與最佳兒童片只能選擇一項進行申報。

          (九)紀(jì)錄片、科教片、戲曲片、美術(shù)片不可申報單項獎。

          (十)單項獎參評人須為中國國籍,如該獎項署名有外籍合作者,此單項不可報名。

          特此通知。

          來源:網(wǎng)易娛樂

          京報訊 7月25日,中國文藝網(wǎng)官網(wǎng)發(fā)布了《關(guān)于參評第三十三屆中國電影金雞獎的通知》。其中,參評編劇獎需注明是原創(chuàng)或改編,參評表演類單項獎(最佳男主角、最佳女主角、最佳男配角、最佳女配角)者,所飾角色的臺詞須由演員本人配音,報名日期為即日起至8月15日。

          全文如下:

          各電影制片機構(gòu):

          根據(jù)《中國電影金雞獎評獎?wù)鲁獭泛汀吨袊娪敖痣u獎評選細(xì)則》有關(guān)規(guī)定,現(xiàn)就報送參評第三十三屆中國電影金雞獎有關(guān)事項通知如下:

          一、獎項設(shè)置

          本屆金雞獎作品獎設(shè)最佳故事片、最佳中小成本故事片、最佳兒童片、最佳紀(jì)錄/科教片、最佳戲曲片、最佳美術(shù)片、最佳外語片。

          本屆金雞獎單項獎設(shè)最佳編劇、最佳導(dǎo)演、最佳男主角、最佳女主角、最佳男配角、最佳女配角、最佳攝影、最佳美術(shù)、最佳音樂、最佳錄音、最佳剪輯、最佳導(dǎo)演處女作獎。

          二、報名范圍

          (一)2019年7月1日至2020年6月30日取得國家電影局核發(fā)的電影片公映許可證的故事片、兒童片、科教片、紀(jì)錄片、戲曲片、美術(shù)片,符合下列條件之一者可報送參評本屆金雞獎作品獎:

          1.內(nèi)地(大陸)電影制片機構(gòu)拍攝的影片;

          2.內(nèi)地(大陸)電影制片機構(gòu)與港澳臺電影制片機構(gòu)合作拍攝的影片;

          3.內(nèi)地(大陸)電影制片機構(gòu)與外國電影制片機構(gòu)合作拍攝的影片;

          4.經(jīng)國家電影局審查通過在內(nèi)地(大陸)發(fā)行的港澳臺影片(不含港澳臺電影制片機構(gòu)與外國電影制片機構(gòu)合作拍攝的影片)。

          (二)上述條款所述影片中申報單項獎?wù)撸毦哂兄腥A人民共和國國籍。

          三、報名程序

          中國電影金雞獎的評獎為每年評選一次,報名日期為即日起至2020年8月15日。

          各制片單位報名參評可直接將所需報送材料快遞至中國電影家協(xié)會金雞獎辦公室,有關(guān)參評表格請在中國文藝網(wǎng)(https://www.cflac.org.cn/zgwl/wlgg/202007/t20200725_488304.html)下載。

          材料寄送地址:北京市朝陽區(qū)北三環(huán)東路22號中國電影家協(xié)會310室

          收件人:中國影協(xié)金雞獎辦公室

          郵 編:100013

          電 話:010-64296094

          四、報名材料

          報送材料包括以下內(nèi)容:

          (一)紙質(zhì)資料:

          1.25套紙質(zhì)報名資料

          (1)國家電影局頒發(fā)的《電影片公映許可證》復(fù)印件;

          (2)參評人(單位)承諾書;

          (3)中國電影金雞獎參評影片申報表、參評單項申報表。

          報名紙質(zhì)材料(A4規(guī)格)以影片為單位(包括《電影片公映許可證》復(fù)印件、參評人(單位)承諾書、影片申報表、單項申報表及需詳細(xì)推薦的材料)裝訂成冊。第一張為《電影片公映許可證》復(fù)印件,第二張為參評人(單位)承諾書,第三張為影片報名表,后面為各單項報名表,裝訂為一套。其中一套為原件,需逐項加蓋申報單位紅色公章,其余24套為該套的復(fù)印件。

          2.申報參評最佳編劇獎?wù)撸杼峁╇娪拔膶W(xué)劇本一式兩份(無水印)。

          (二)電子版資料:

          1.中國電影金雞獎參評影片申報表和參評單項申報表(doc或docx格式);

          2.高清圖片:包括影片海報1張以上、劇照3-5張、參評單項者的照片(個人劇照、工作照、藝術(shù)照均可)1-2張;

          3.簡要故事梗概(300字以內(nèi),doc或docx格式);

          4.申報參評最佳編劇獎?wù)撸杼峁╇娪拔膶W(xué)劇本(doc或docx格式,無水印)。

          上述所有電子版資料請刻在光盤上,報名時光盤隨紙質(zhì)資料和其它資料一并寄給金雞獎辦公室。

          (三)其他資料:

          1.影片2K開口無密鑰數(shù)字硬盤(要求有龍標(biāo)無水印);

          2.影片DVD光盤(全片,要求有龍標(biāo)無水印);

          3.影片高清片花:含片名、單項獎報名者鏡頭(不超過5分鐘,mp4格式),可含拍攝花絮(不超過3分鐘,mp4格式)。請將片花存儲在移動硬盤中,與其它報名資料一起寄給金雞獎辦公室,使用完畢后將予以歸還。

          五、注意事項

          (一)請各申報機構(gòu)和審核單位本著實事求是的精神,嚴(yán)格篩選、擇優(yōu)申報。

          (二)參評作品獎的影片,須認(rèn)真填寫影片參評申報表中所列各項,出品單位名稱及其排序、數(shù)量應(yīng)與公映許可證一致,如有不一致的特殊情況,如公司改名或某家出品方不參評等情況,需要出具加蓋公章的說明。創(chuàng)作人員名稱及其排序應(yīng)與影片字幕一致,如有特殊情況,需出具加蓋公章的說明。

          (三)如報名單項獎的一個獎項有多人,需每人填寫一張報名表,并注明順序。

          (四)參評編劇獎需注明是原創(chuàng)或改編。

          (五)參評表演類單項獎(最佳男主角、最佳女主角、最佳男配角、最佳女配角)者,所飾角色的臺詞須由演員本人配音。

          (六)參評最佳中小成本故事片(候選作品要求投資為低于1000萬人民幣的故事片),必須標(biāo)明影片制作成本。

          (七)最佳導(dǎo)演與最佳導(dǎo)演處女作獎只能選擇一個進行申報。最佳導(dǎo)演處女作獎要求是該導(dǎo)演獨立執(zhí)導(dǎo)的第一部影片。

          (八)最佳故事片、最佳中小成本故事片與最佳兒童片只能選擇一項進行申報。

          (九)紀(jì)錄片、科教片、戲曲片、美術(shù)片不可申報單項獎。

          (十)單項獎參評人須為中國國籍,如該獎項署名有外籍合作者,此單項不可報名。

          特此通知。

          新京報編輯 徐美琳

          校對 吳興發(fā)

          來源:新京報


          信大家看到這張圖片就知道我們這篇文章要講什么了,沒錯就是-商品多規(guī)格選擇的解法。

          近來在掘金上面看見大家都在研究“商品多規(guī)格選擇”的問題,例如晨曦大佬的前端電商 sku 的全排列算法很難嗎?學(xué)會這個套路,徹底掌握排列組合。 在這篇文章里面,大佬寫明了如何實現(xiàn)sku的全排列,思路非常的棒,但是并沒有緊貼業(yè)務(wù)場景。真正的業(yè)務(wù)場景是,我們要根據(jù)用戶每一次選擇的規(guī)格,找出剩下可選的規(guī)格和不可選的規(guī)格,表現(xiàn)在前端頁面上:就是將不可選的規(guī)格置回,也就是如下效果(可以點擊這里查看最終效果):

          那么今天我們就來講講這個問題的一個解決方法,要講明白很難,但是我相信你看了這篇文章之后,sku就再也難不倒你了。

          什么是 sku

          在介紹具體解法之前,我們先來介紹一下什么是sku? sku是會計學(xué)中的一個名詞,被稱作庫存單元。說人話?簡單來講就是,我們上圖 中每一個單規(guī)格選項,例如深空灰色、64G,都是一個規(guī)格(sku)。商品和sku屬于一對多的關(guān)系,也就是我們可以選擇多個sku來確定到某個具體的商品:

          業(yè)務(wù)場景

          可以這么說,只要是做電商類相關(guān)的產(chǎn)品,比如購物 APP、購物網(wǎng)站等等,都會遇到這么一個場景,每個商品對應(yīng)著多個規(guī)格,用戶可以根據(jù)不同的規(guī)格組合,選擇出自己想要的產(chǎn)品。我們自己在生活中也會經(jīng)常用到這個功能,然而就是這樣一個簡單的功能,卻難倒了很多小伙伴。

          筆者也是一樣,剛開始遇到這個場景,筆者覺得應(yīng)該一個下午就能搞定,完美收工,奈何還是太過于年輕,搞了差不多兩天,在網(wǎng)上查閱了很多相關(guān)的文章和資料,但是不得其解,最后沒有辦法,只能硬著頭皮采用暴力求解(也就是不斷循環(huán))的方法來解決的,時間復(fù)雜度賊高,達到了O(m*n)也就是O(n2),這種實現(xiàn)方法其實也不是不行(能跑就行),對吧。但是后來筆者發(fā)現(xiàn),當(dāng)一個商品的規(guī)格非常非常多、并且用戶的設(shè)備性能不是那么好的情況下,那么這種實現(xiàn)方式就會導(dǎo)致運行時間過長,表現(xiàn)在頁面上就是:當(dāng)用戶點擊了一個規(guī)格,會有明顯的卡頓,那怎么行,客戶都流失了,老板還怎么買法拉利 ??所以筆者又開始了研究。

          一個偶然的機會,筆者在逛知乎的時候,看到了有人在討論圖,這個數(shù)據(jù)結(jié)構(gòu),突然靈光一現(xiàn),貌似咱們的多規(guī)格選擇也可以用圖來作求解方法,后來一嘗試,還真的可行。而且時間復(fù)雜度只有O(n),簡直完美。所以我們下面來介紹一下圖,什么是圖?相信大學(xué)學(xué)過數(shù)據(jù)結(jié)構(gòu)與算法的同學(xué)都應(yīng)該知道,不過應(yīng)該已經(jīng)忘得一干二凈了。

          什么是圖

          圖其實是數(shù)學(xué)的一個分支。它以圖為研究對象。圖論中的圖是由若干給定的點及連接兩點的線所構(gòu)成的圖形,這種圖形通常用來描述某些事物之間的某種特定關(guān)系,用點代表事物,用連接兩點的線表示相應(yīng)兩個事物間具有這種關(guān)系:

          圖通常有如下分類:

          • 分為有向圖和無向圖
          • 分為有權(quán)圖和無權(quán)圖

          好了知道這兩個概念就差不多了,當(dāng)然如果想了解更多更多概念,請看這里

          那么我們需要用到的是無向圖,什么是無向圖呢,就像這樣:

          兩個頂點之間如果有連線,則表示這兩個頂點是互通的。小伙伴們看到這里可能會懵逼了,說了這么多,好像跟我們要解決的問題沒關(guān)系啊。小伙伴們現(xiàn)在想一想:用戶在選擇規(guī)格的時候,肯定是沒有先后順序的,假設(shè)我們現(xiàn)在把每種規(guī)格看作是無向圖的一個頂點的話,我們可以根據(jù)這些單項規(guī)格的組合規(guī)格,就可以畫出一個像上圖一樣的無向圖。

          鄰接矩陣

          假設(shè)我們已經(jīng)畫出了如上 的無向圖,那么我們?nèi)绾螌⑦@個圖用咱們的代碼來表示呢?這里就用到了鄰接矩陣

          鄰接矩陣其實是《線性代數(shù)》里面的概念,相信很多小伙伴都不會陌生,我們在代碼中,表示它的方法是用一個n x n的二維數(shù)組來抽象鄰接矩陣。讓我們來把上面 這個無向圖用鄰接矩陣(二維數(shù)組)表示出來:

          很顯然,如果兩個頂點互通(有連線),那么它們對應(yīng)下標(biāo)的值則為 1,否則為 0。

          好了,下面開始逐步都是高能,請小伙伴們認(rèn)真觀看。

          假設(shè)現(xiàn)在我們有如下規(guī)格列表:

          specList: [
            { title: "顏色", list: ["紅色", "紫色"] },
            { title: "套餐", list: ["套餐一", "套餐二"] },
            { title: "內(nèi)存", list: ["64G", "128G", "256G"] },
          ];

          可供選擇的規(guī)格組合有:

          specCombinationList: [
              { id: "1", specs: ["紫色", "套餐一", "64G"] },
              { id: "2", specs: ["紫色", "套餐一", "128G"] },
              { id: "3", specs: ["紫色", "套餐二", "128G"] },
              { id: "4", specs: ["紅色", "套餐二", "256G"] }
            ],

          首先,我們根據(jù)specList知道:我們有“顏色”、“套餐”、“內(nèi)存”三種規(guī)格類別。分別有紅色、紫色、套餐一、套餐二、64G、128G、256G這些單項規(guī)格。每個單項規(guī)格作為一個頂點,所以就有如下頂點:

          然后我們根據(jù)specCombinationList,我們可以知道,哪些規(guī)格的組合是可選的。好了我們要開始畫圖了。

          根據(jù){ id: "1", specs: ["紫色", "套餐一", "64G"] },我們可以畫出:

          接下來依葫蘆畫瓢:我們可以根據(jù)specCombinationList剩下的數(shù)據(jù)畫出如下的圖:

          好了,我們已經(jīng)根據(jù)specCombinationList(也就是可選規(guī)格組合)將我們的規(guī)格無向圖畫完了。現(xiàn)在我們來模擬一下用戶的選擇:

          specCombinationList: [
              { id: "1", specs: ["紫色", "套餐一", "64G"] },
              { id: "2", specs: ["紫色", "套餐一", "128G"] },
              { id: "3", specs: ["紫色", "套餐二", "128G"] },
              { id: "4", specs: ["紅色", "套餐二", "256G"] }
            ],

          假設(shè)用戶先選擇了紫色、根據(jù)specCombinationList,我們發(fā)現(xiàn)套餐一、套餐二、64G、128G是可選的,這個時候我們發(fā)現(xiàn)一個問題:顯然跟紫色同級的紅色其實也是可選的。所以這個圖其實我們還沒有畫完。所以相同類型的規(guī)格其實是應(yīng)該連接起來的:

          好了,無向圖畫好了,現(xiàn)在我們將它映射到鄰接矩陣上面(這一步強烈建議小伙伴們拿出紙筆來一起畫一畫):

          到了這一步,恭喜你,你已經(jīng)懂了一大半了 。

          好了,到這我們就可以公布最終結(jié)論了:

          • 當(dāng)用戶初次進入該頁面時,所有的規(guī)格均可選:
          • 當(dāng)用戶選擇了某個頂點后,當(dāng)前頂點所有可選項均被找出(即是當(dāng)前頂點所在列值為 1 的頂點):
          • 選取多個頂點時,可選項是各個頂點鄰接點的交集:(即是選中頂點所在列的交集)

          代碼實現(xiàn)

          說真的,我覺得小伙伴們看明白了我上面 這些講解,相信你已經(jīng)完全懂了該如何實現(xiàn)“多規(guī)格選擇”算法了。不過有句話叫做:光說不練假把式!那下面我們就一起來捋一捋,用代碼如何實現(xiàn)吧,筆者這里用的前端框架是react,明白思路了,用什么框架都一樣的哦。

          這里先說下思路:

          1、根據(jù)規(guī)格列表(specList)創(chuàng)建鄰接矩陣(數(shù)組)

          2、根據(jù)可選規(guī)格組合(specCombinationList)填寫頂點的值

          3、獲得所有可選頂點,然后根據(jù)可選頂點填寫同級頂點的值

          創(chuàng)建鄰接矩陣

          首先,我們需要提供一個類來創(chuàng)建鄰接矩陣。一個鄰接矩陣,首先需要傳入一個頂點數(shù)組:vertex,需要一個用來裝鄰接矩陣的數(shù)組:adjoinArray。剛剛我們上面說到了,這個類還必須提供計算并集和交集的方法:

          export type AdjoinType=Array<string>;
          
          export default class AdjoinMatrix {
            vertex: AdjoinType; // 頂點數(shù)組
            quantity: number; // 矩陣長度
            adjoinArray: Array<number>; // 矩陣數(shù)組
          
            constructor(vertx: AdjoinType) {
              this.vertex=vertx;
              this.quantity=this.vertex.length;
              this.adjoinArray=[];
              this.init();
            }
            // 初始化數(shù)組
            init() {
              this.adjoinArray=Array(this.quantity * this.quantity).fill(0);
            }
          
            /*
             * @param id string
             * @param sides Array<string>
             *  傳入一個頂點,和當(dāng)前頂點可達的頂點數(shù)組,將對應(yīng)位置置為1
             */
            setAdjoinVertexs(id: string, sides: AdjoinType) {
              const pIndex=this.vertex.indexOf(id);
              sides.forEach((item)=> {
                const index=this.vertex.indexOf(item);
                this.adjoinArray[pIndex * this.quantity + index]=1;
              });
            }
          
            /*
             * @param id string
             * 傳入頂點的值,獲取該頂點的列
             */
            getVertexCol(id: string) {
              const index=this.vertex.indexOf(id);
              const col: Array<number>=[];
              this.vertex.forEach((item, pIndex)=> {
                col.push(this.adjoinArray[index + this.quantity * pIndex]);
              });
              return col;
            }
          
            /*
             * @param params Array<string>
             * 傳入一個頂點數(shù)組,求出該數(shù)組所有頂點的列的合
             */
            getColSum(params: AdjoinType) {
              const paramsVertex=params.map((id)=> this.getVertexCol(id));
              const paramsVertexSum: Array<number>=[];
              this.vertex.forEach((item, index)=> {
                const rowtotal=paramsVertex
                  .map((value)=> value[index])
                  .reduce((total, current)=> {
                    total +=current || 0;
                    return total;
                  }, 0);
                paramsVertexSum.push(rowtotal);
              });
              return paramsVertexSum;
            }
          
            /*
             *  @param params Array<string>
             * 傳入一個頂點數(shù)組,求出并集
             */
            getCollection(params: AdjoinType) {
              const paramsColSum=this.getColSum(params);
              let collections: AdjoinType=[];
              paramsColSum.forEach((item, index)=> {
                if (item && this.vertex[index]) collections.push(this.vertex[index]);
              });
              return collections;
            }
          
            /*
             *  @param params Array<string>
             * 傳入一個頂點數(shù)組,求出交集
             */
            getUnions(params: AdjoinType) {
              const paramsColSum=this.getColSum(params);
              let unions: AdjoinType=[];
              paramsColSum.forEach((item, index)=> {
                if (item >=params.length && this.vertex[index]) unions.push(this.vertex[index]);
              });
              return unions;
            }
          }

          有了這個類,接下來可以創(chuàng)建一個專門用于生成商品多規(guī)格選擇的類,它繼承于AdjoinMatrix。

          創(chuàng)建多規(guī)格選擇鄰接矩陣

          我們這個多規(guī)格選擇的鄰接矩陣,需要提供一個查詢可選頂點的方法:getSpecscOptions

          import AdjoinMatrix from "./adjoin-martix";
          import { AdjoinType } from "./adjoin-martix";
          import { SpecCategoryType, CommoditySpecsType } from "../redux/reducer/spec-reducer";
          
          export default class SpecAdjoinMatrix extends AdjoinMatrix {
            specList: Array<CommoditySpecsType>;
            specCombinationList: Array<SpecCategoryType>;
          
            constructor(specList: Array<CommoditySpecsType>, specCombinationList: Array<SpecCategoryType>) {
              super(specList.reduce((total: AdjoinType, current)=> [...total, ...current.list], []));
              this.specList=specList;
              this.specCombinationList=specCombinationList;
              // 根據(jù)可選規(guī)格列表矩陣創(chuàng)建
              this.initSpec();
              // 同級頂點創(chuàng)建
              this.initSameLevel();
            }
          
            /**
             * 根據(jù)可選規(guī)格組合填寫鄰接矩陣的值
             */
            initSpec() {
              this.specCombinationList.forEach((item)=> {
                this.fillInSpec(item.specs);
              });
            }
            // 填寫同級點
            initSameLevel() {
              // 獲得初始所有可選項
              const specsOption=this.getCollection(this.vertex);
              this.specList.forEach((item)=> {
                const params: AdjoinType=[];
                // 獲取同級別頂點
                item.list.forEach((value)=> {
                  if (specsOption.includes(value)) params.push(value);
                });
                // 同級點位創(chuàng)建
                this.fillInSpec(params);
              });
            }
            /*
             * 傳入頂點數(shù)組,查詢出可選規(guī)格
             * @param params
             */
            getSpecscOptions(params: AdjoinType) {
              let specOptionCanchoose: AdjoinType=[];
              if (params.some(Boolean)) {
                // 過濾一下選項
                specOptionCanchoose=this.getUnions(params.filter(Boolean));
              } else {
                // 所有可選項
                specOptionCanchoose=this.getCollection(this.vertex);
              }
              return specOptionCanchoose;
            }
          
            /*
             * @params
             * 填寫鄰接矩陣的值
             */
            fillInSpec(params: AdjoinType) {
              params.forEach((param)=> {
                this.setAdjoinVertexs(param, params);
              });
            }

          頁面渲染

          好了到了這一步,我們已經(jīng)可以在頁面中使用這兩個類了:

          import React, { useState, useMemo } from "react";
          import { useSelector } from "react-redux";
          import { RootState } from "../redux/reducer/root-reducer";
          import SpecAdjoinMatrix from "../utils/spec-adjoin-martix";
          import "./spec.css";
          const classNames=require("classnames");
          
          const Spec: React.FC=()=> {
            const { specList, specCombinationList }=useSelector((state: RootState)=> state.spec);
            // 已選擇的規(guī)格,長度為規(guī)格列表的長度
            const [specsS, setSpecsS]=useState(Array(specList.length).fill(""));
          
            // 創(chuàng)建一個規(guī)格矩陣
            const specAdjoinMatrix=useMemo(()=> new SpecAdjoinMatrix(specList, specCombinationList), [specList, specCombinationList]);
            // 獲得可選項表
            const optionSpecs=specAdjoinMatrix.getSpecscOptions(specsS);
          
            const handleClick=function(bool: boolean, text: string, index: number) {
              // 排除可選規(guī)格里面沒有的規(guī)格
              if (specsS[index] !==text && !bool) return;
              // 根據(jù)text判斷是否已經(jīng)被選中了
              specsS[index]=specsS[index]===text ? "" : text;
              setSpecsS(specsS.slice());
            };
          
            return (
              <div className="container">
                {specList.map(({ title, list }, index)=> (
                  <div key={index}>
                    <p className="title">{title}</p>
                    <div className="specBox">
                      {list.map((value, i)=> {
                        const isOption=optionSpecs.includes(value); // 當(dāng)前規(guī)格是否可選
                        const isActive=specsS.includes(value); // 當(dāng)前規(guī)格是否被選
                        return (
                          <span
                            key={i}
                            className={classNames({
                              specOption: isOption,
                              specAction: isActive,
                              specDisabled: !isOption,
                            })}
                            onClick={()=> handleClick(isOption, value, index)}
                          >
                            {value}
                          </span>
                        );
                      })}
                    </div>
                  </div>
                ))}
              </div>
            );
          };
          
          export default Spec;

          好了,打完收工了,如果有小伙伴想看實現(xiàn)效果,可以查看這里,如果有小伙伴想把代碼拉到本地看看,那么請點擊這里

          總結(jié)

          實踐證明:大學(xué)學(xué)的東西是真的有用的。我們通過圖,解決了商品多規(guī)格選擇的難題。在求解可選規(guī)格的時候,時間復(fù)雜度由原來的O(n2)變成了O(n)。不過值得一提的是,采用鄰接矩陣來存儲圖,空間復(fù)雜度就變成了O(n2)了,同時也存在浪費空間的問題,但是圖肯定不止有鄰接矩陣這一種存儲方法,我們還可以用鏈表來存儲圖,小伙伴們可以自己去試一試。另外如果用鏈表來存儲圖,空間復(fù)雜度會變低,但是時間復(fù)雜度會變高,具體如何選擇,就看小伙伴們自己權(quán)衡了。

          以后遇到這個需求,小伙伴們肯定是分分鐘實現(xiàn),提早下班。

          我是覺非,碼字不易,如果你覺得這篇文章對你有用的話,請給個贊吧!!


          作者:覺非
          鏈接:https://juejin.im/post/5eef2fcee51d4574113a0203
          來源:掘金
          著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。


          主站蜘蛛池模板: 国产精品污WWW一区二区三区| 亚洲AV无码一区东京热| 波多野结衣中文字幕一区二区三区| 亚洲一区动漫卡通在线播放| 色窝窝无码一区二区三区成人网站| 无码国产精品一区二区免费16| 日本视频一区在线观看免费 | 中文字幕亚洲一区二区va在线| 日本一区二区三区高清| 无码AV中文一区二区三区| 中文字幕亚洲综合精品一区| 日韩国产免费一区二区三区| 国产在线不卡一区| 手机看片一区二区| 在线观看国产一区二三区| 国产一区二区三区樱花动漫| 国产丝袜无码一区二区三区视频| 少妇无码一区二区二三区| 成人精品视频一区二区三区尤物| 国产成人精品久久一区二区三区av| 国产日韩一区二区三区在线观看 | 午夜AV内射一区二区三区红桃视| 韩国资源视频一区二区三区| 国产一区二区视频在线观看| 日韩精品一区二区三区老鸭窝| 亚洲日本中文字幕一区二区三区| 久久久久人妻精品一区二区三区| 精品一区二区三区AV天堂| 搡老熟女老女人一区二区| 国产一区风间由美在线观看| 午夜福利一区二区三区高清视频| 国模精品一区二区三区视频| 国产一区二区三区不卡AV| 在线观看精品一区| 免费无码VA一区二区三区| 蜜桃视频一区二区| 一区二区三区无码被窝影院| 日亚毛片免费乱码不卡一区| 亚洲国产精品一区二区久| 香蕉视频一区二区三区| 国产精品一区不卡|