过滤数组并根据另一个数组对数组重新排序

时间:2018-11-28 07:14:12

标签: javascript

因此,我有一个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)

4 个答案:

答案 0 :(得分:1)

我建议使用access属性来过滤predefinedList,并使用一个对象对具有未知值name的默认值的项目进行排序。在这种情况下,这些项目通过使用巨大的值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; }

答案 1 :(得分:0)

您可以使用if..elseif方法来生成.filter数组,而不是使用userAccessList梯形图。请参见下面的代码。

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

let userAccessArray = ["edit", "about", "home"]


let userAccessList = predefinedList.filter(item =>
  userAccessArray.indexOf(item.path.substr(1)) > -1)


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)

答案 2 :(得分:0)

如何更改预定义列表,然后轻松访问:

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

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

let userAccessList = userAccessArray.map(item => predefinedList[item]);

console.log(userAccessList);

编辑:根据您对代码的更改来更改代码。至于orderOfTabs,这并不能真正优化。

答案 3 :(得分:0)

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

let userAccessArray = ["admin", "edit", "about", "home"]

function getUserActionList(type) {
    switch(type) {
    case 'about':
        return predefinedList[1];
    case 'home':
        return predefinedList[0];
    case 'edit':
        return predefinedList[2];
    case 'admin':
        return predefinedList[3];
  }
}

let userAccessList = userAccessArray.map(userAccess => getUserActionList(userAccess));

userAccessList.sort( function (a, b) {
    var prevV = a['name'], nextV = b['name'];
  return (orderOfTabs.indexOf(prevV) > orderOfTabs.indexOf(nextV)) ? 1 : -1;
});

console.log(userAccessList)