首页 > 解决方案 > 过滤数组并根据另一个数组重新排序数组

问题描述

所以我有一个数组userAccessArray,每个用户都有基于该数组可以访问的所有内容,我正在检查predefinedArrayList所有对象来自应用程序的位置并创建一个新的对象数组。[过滤它]

之后我根据另一个数组重新排列顺序。这就是我的最终结果。

下面是代码,它可以工作,但我认为应该有更好的方法。

let predefinedList = [{name: "Home Page", path:"/home"},{name: "About Page", path:"/about"}, {name: "Edit Page", path:"/edit"}, {name: "Admin Page", path:"/admin"} ]

let userAccessArray = ["editing", "aboutUs", "home"]


let userAccessList = userAccessArray.map(userAccess =>   {
    if(userAccess === "aboutUs"){
      return predefinedList[1]
    }else if(userAccess === "editing"){
      return predefinedList[2]
    }else if(userAccess === "home"){
      return predefinedList[0]
    }else if(userAccess === "adminAccess"){
      return predefinedList[3]
    }
  })
  
  
const orderOfTabs = ["Home Page", "Edit Page", "About Page", "Admin Page"]

const finalTabsArray = orderOfTabs.map(orderOfTab => userAccessList.find(userAccess => userAccess.name === orderOfTab)).filter(item => item)

console.log("finalTabsArray", finalTabsArray)

标签: javascript

解决方案


我建议使用一个access用于过滤的属性和一个用于对具有未知属性predefinedList的默认值的项目进行排序的对象。name在这种情况下,这些项目通过一个巨大的 value 排序在列表的末尾Infinity

const
    orderOfTabs = { "Home Page": 1, "Edit Page": 2, "About Page": 3, "Admin Page": 4, default: Infinity },
    predefinedList = [{ name: "Home Page", path:"/home", access: "home" }, { name: "About Page", path:"/about", access: "aboutUs" }, { name: "Edit Page", path:"/edit", access: "editing" }, { name: "Admin Page", path:"/admin", access: "adminAccess" }],
    userAccessArray = ["editing", "aboutUs", "home"],
    finalTabsArray = predefinedList
        .filter(({ access }) => userAccessArray.includes(access))
        .sort(({ name: a }, { name: b }) =>
            (orderOfTabs[a] || orderOfTabs.default) - (orderOfTabs[b] || orderOfTabs.default));

console.log(finalTabsArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读