【问题标题】:Angular sort array as another array角度排序数组作为另一个数组
【发布时间】:2019-03-31 00:08:12
【问题描述】:

我有一个如下所示的数组

 [
   {
      "key":"Human Resources",
      "data":[
         {
            "id":"1HwahYXr5hs3IDTn7RtC",
            "element":{
               "id":"1HwahYXr5hs3IDTn7RtC",
               "ca":"1x"

            },
            "groupBy":"Human Resources_Human Resources"
         },
         {
            "id":"I7kCoWl7JLCWvgSdZm6p",
            "element":{
               "id":"I7kCoWl7JLCWvgSdZm6p",
               "ca":"2x"

            },
            "groupBy":"Human Resources"
         }
      ]
   },
   {
      "key":"Marketing",
      "data":[
         {
            "id":"Ltgk4vvKNILwYry1thXL",
            "element":{
               "id":"Ltgk4vvKNILwYry1thXL",
               "ca":"5x"
            },
            "groupBy":"Marketing_Marketing"
         },
         {
            "id":"aA43supw5IYmVLkniC8c",
            "element":{
               "id":"aA43supw5IYmVLkniC8c",
               "ca":"6x"
            },
            "groupBy":"Marketing"
         }
      ]
   },
   {
      "key":"Sales",
      "data":[
         {
            "id":"WwYl7FelUSVo8i5eMYMk",
            "element":{
               "id":"WwYl7FelUSVo8i5eMYMk",
               "ca":"8x"
            },
            "groupBy":"Sales"
         }
      ]
   }
]

我有另一个数组存储上面数组的键的排名,如下所示

[
{
"id":1,
"name":"Marketing",
"rank":2
},
{
"id":1,
"name":"Human Resources",
"rank":1
}
]

我需要根据第二个数组中的键排名对第一个数组进行排序,如果任何键不在第二个中,它将在顶部..

请告知是否有任何 inbuit 函数可以像 lodash 中的任何函数一样执行此操作..

谢谢

【问题讨论】:

  • 请添加结果以及您尝试过的内容。
  • 排名是否唯一且连续?
  • 是的,它将是独一无二的

标签: javascript angular sorting lodash


【解决方案1】:

您可以将排名或-Infinity 用于未指定排名的排名。

var array = [{ key: "Human Resources" }, { key: "Marketing" }, { key: "Sales" }],
    ranking = [{ id: 1, name: "Marketing", rank: 2 }, { id: 1, name: "Human Resources", rank: 1 }],
    order = ranking.reduce((o, { name, rank }) => (o[name] = rank, o), Object.create(null));

array.sort(({ key: a }, { key: b }) => (order[a] || -Infinity) - (order[b] || -Infinity));

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

【讨论】:

    【解决方案2】:

    您可以为每个排序,过滤数据并添加属性范围,然后对数据进行排序

    ranking.forEach(x=>{
      data.filter(d=>d.key==d.name).forEach(df=>{
           df.rank=x.rank; //Add a new property
         }
      })
    
    ranking.sort((a,b)=>(a.rank || 0)-(b.rank || 0));
    

    我认为排名是数组宽度排名,数据是数组宽度数据

    【讨论】:

    • 没有循环是不可能的吗,至少不运行两个循环
    【解决方案3】:

    这应该可行,

    arr.sort((a,b) => {
      rank1 = rank.find(e => e.name ===a.key);
      rank2 = rank.find(e => e.name ===b.key);
      if (!rank1 || !rank2) {
        return 1;
      }
      if (rank1.rank < rank2.rank) {
        return -1;
     } else {
       return 1;
    }
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      相关资源
      最近更新 更多