【问题标题】:2 arrays/objects with same values but one has more objects - how to simplify code without repeating?2 个具有相同值但一个具有更多对象的数组/对象 - 如何简化代码而不重复?
【发布时间】:2021-07-27 11:40:23
【问题描述】:

我遇到以下问题。我创建了 2 个数组,名为:editorDeskadminDesk,实际上唯一的区别是,adminDesk 有菜单项 => 路线、导航和朋友。

问题是我有重复的代码来完成这项工作。但我想用一张桌子让它变得简单,像这样:defaultDesk 并检查管理员用户是否显示这个,否则什么都不做。

我怎样才能做到这一点?

我的代码:

import S from '@sanity/desk-tool/structure-builder'

import sanityClient from 'part:@sanity/base/client'

import PagePreview from '../studio/src/components/preview/page/PagePreview'

import {
   FiPaperclip,
   FiUser,
   FiUsers,
   FiEdit,
   FiSettings,
   FiMessageSquare,
   FiHeart,
   FiInfo,
   FiNavigation,
   FiFileText,
   FiFile,
   FiTag,
   FiCheckSquare
} from 'react-icons/fi'

const client = sanityClient.withConfig({ apiVersion: 'v1' })

const groupQuery = '* [_type == "system.group" && $identity in members] {_id}'

const hiddenDocTypes = (listItem) =>
   ![
      'author',
      'post',
      'page',
      'category',
      'theme',
      'comment',
      'friends',
      'route',
      'navigation',
      'general',
      'featured',
      'cookie'
   ].includes(listItem.getId())

const siteMenu = () =>
   client
      .fetch(groupQuery)
      .then((docs) => docs.map((doc) => doc._id.split('.').pop()))
      .then((groupNames) => {
         const defaultDesk = [
            S.listItem()
               .title('Posts')
               .child(S.documentTypeList('post').title('Posts overview'))
               .schemaType('post')
               .icon(FiEdit),

            S.divider(),

            S.listItem()
               .title('Pages')
               .child(S.documentTypeList('page').title('Pages overview'))
               .schemaType('page')
               .icon(FiFile),

            S.divider(),

            S.listItem()
               .title('Authors')
               .child(S.documentTypeList('author').title('Authors overview'))
               .schemaType('author')
               .icon(FiUser),

            S.divider(),

            S.listItem()
               .title('Themes')
               .child(S.documentTypeList('theme').title('Themes overview'))
               .schemaType('theme')
               .icon(FiHeart),

            S.divider(),

            S.listItem()
               .title('Categories')
               .child(
                  S.documentTypeList('category').title('Categories overview')
               )
               .schemaType('category')
               .icon(FiTag),

            S.divider(),

            S.listItem()
               .title('Comments')
               .child(S.documentTypeList('comment').title('Comments overview'))
               .schemaType('comment')
               .icon(FiMessageSquare),

            S.divider()
         ]

         const editorDesk = [
            // Settings menu with sub-menu's.
            S.listItem()
               .title('Settings')
               .child(
                  S.list()
                     .title('Settings')
                     .items([
                        S.listItem()
                           .title('General')
                           .icon(FiInfo)
                           .child(
                              S.document()
                                 .schemaType('general')
                                 .documentId('generalSettings')
                                 .title('General Settings')
                           ),

                        S.divider(),

                        S.listItem()
                           .title('Featured articles')
                           .icon(FiFileText)
                           .child(
                              S.document()
                                 .schemaType('featured')
                                 .documentId('featuredArticlesSettings')
                                 .title('Featured Articles Settings')
                           ),

                        S.divider()
                     ])
               )
               .icon(FiSettings),

            ...S.documentTypeListItems().filter(hiddenDocTypes)
         ]

         const adminDesk = [
            // Settings menu with sub-menu's.
            S.listItem()
               .title('Settings')
               .child(
                  S.list()
                     .title('Settings')
                     .items([
                        S.listItem()
                           .title('General')
                           .icon(FiInfo)
                           .child(
                              S.document()
                                 .schemaType('general')
                                 .documentId('generalSettings')
                                 .title('General Settings')
                           ),

                        S.divider(),

                        S.listItem()
                           .title('Navigation')
                           .icon(FiNavigation)
                           .child(
                              S.document()
                                 .schemaType('navigation')
                                 .documentId('navigationSettings')
                                 .title('Navigation Settings')
                           ),

                        S.divider(),

                        S.listItem()
                           .title('Featured articles')
                           .icon(FiFileText)
                           .child(
                              S.document()
                                 .schemaType('featured')
                                 .documentId('featuredArticlesSettings')
                                 .title('Featured Articles Settings')
                           ),

                        S.divider(),

                        S.listItem()
                           .title('Cookie Consent')
                           .icon(FiCheckSquare)
                           .child(
                              S.document()
                                 .schemaType('cookie')
                                 .documentId('cookieSettings')
                                 .title('Cookie Consent Settings')
                           ),

                        S.divider(),

                        S.listItem()
                           .title('Friends team')
                           .icon(FiUsers)
                           .child(
                              S.document()
                                 .schemaType('friends')
                                 .documentId('settingsFriends')
                                 .title('Friends Settings')
                           )
                     ])
               )
               .icon(FiSettings),

            ...S.documentTypeListItems().filter(hiddenDocTypes)
         ]

         if (groupNames.includes('editors')) {
            return S.list()
               .title('Website (editor)')
               .items([...defaultDesk, ...editorDesk])
         }

         if (groupNames.includes('administrator')) {
            return S.list()
               .title('Website (admin)')
               .items([...defaultDesk, ...adminDesk])
         }

         return S.list().title('Website').items(deskItems)
      })
      .catch(() => {
         // In case of any errors fetching the groups, just return some standard
         // structure. This will only happen if the query cannot be performed for
         // some reason.
         return S.list().title('Website').items([])
      })

export default siteMenu

export const getDefaultDocumentNode = (props) => {
   /**
    * Here you can define fallback views for document types without
    * a structure definition for the document node. If you want different
    * fallbacks for different types, or document values (e.g. if there is a slug present)
    * you can set up that logic in here too.
    * https://www.sanity.io/docs/structure-builder-reference#getdefaultdocumentnode-97e44ce262c9
    */
   const { schemaType } = props
   if (schemaType === 'page') {
      return S.document().views([
         S.view.form(),
         S.view.component(PagePreview).title('Preview Page')
      ])
   }

   return S.document().views([S.view.form()])
}

【问题讨论】:

    标签: javascript sanity


    【解决方案1】:

    合并可以在这里工作

    您可以定义具有某种结构的默认办公桌,然后

    const someOtherDesk = [
       ...defaultDesk,
       restOfTheCode
    ]
    

    或者如果它不是那么简单并且必须在根级别更深地合并=>

    const someOtherDesk = Object.assign([], defaultDesk, adminDesk);
    
    • 创建新数组,合并 defaultDesk,然后合并 adminDesk

    【讨论】:

      猜你喜欢
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多