如何根据“rank”对象属性重新分配列表(在typescript中)?

时间:2017-04-12 12:23:46

标签: javascript list typescript

我正在尝试创建一个基于其rank属性重新分配列表的函数。 例如:(我的对象有其他属性)

var array=[
{id:1,rank:2},
{id:18,rank:1},
{id:53,rank:3},
{id:3,rank:5},
{id:19,rank:4},//this item
]

此项{id:19,rank:4}现在位于第2位。数组变为

 item= { currentRank: 4; newRank: 2} //see below

    array=[
    {id:1,rank:3},
    {id:18,rank:1},
    {id:53,rank:4},
    {id:3,rank:5},
    {id:19,rank:2},
    ]

仅供参考:这些项目在html拖放操作后重新排序。 因此,我正在尝试根据项目排名重新分配排名。 我知道掉落项目新排名及其旧排名。

到目前为止,我已经完成了以下操作,但它并不适用于所有情况:

public reorderArray(item: { currentRank: string; newRank: string }, array: { id: string, rank: string }[]): { id: string, rank: string } [] {


      let arr = array.map(a => Object.assign({}, a)).sort((a, b) => (parseInt(a.rank) - parseInt(b.rank))).slice();
      //To avoid to change the reference??
      let isOrdered = arr.every((element, index, array) => {
        return array[index + 1] ? element.rank + 1 == array[index + 1].rank : true
      });

  if (isOrdered && arr[0].rank == (1).toString()) {


    if (parseInt(item.currentRank) < parseInt(item.newRank)) {
      //on descend un élément dans la liste => +1 entre le currentRank et )le newRank
      for (let i = parseInt(item.currentRank); i < parseInt(item.newRank); i++) {
        arr[i].rank = (parseInt(arr[i].rank) - 1).toString();
      }
      arr[parseInt(item.currentRank)].rank = (parseInt(item.newRank)).toString();
    }
    else if (parseInt(item.currentRank) > parseInt(item.newRank)) {
      for (let i = parseInt(item.newRank); i < parseInt(item.currentRank); i++) {
        arr[i].rank = (parseInt(arr[i].rank) + 1).toString();
      }
      arr[parseInt(item.currentRank)].rank = (parseInt(item.newRank) + 1).toString();
    }
    return arr


  }
  else {
    alert("This list is not ordered");
  }
}

nb:如果数组没有正确获得(等级为1,3,4 ...),则函数不会执行任何操作。

3 个答案:

答案 0 :(得分:1)

您可以使用数组进行拼接和迭代,然后校正范围。

function changeRank(object) {
    ranks.splice(object.newRank - 1, 0, ranks.splice(object.currentRank - 1, 1)[0]);
    ranks.forEach(function (a, i) {
        a.rank = i + 1;
    });
}

var array = [{ id: 1, rank: 2 }, { id: 18, rank: 1 }, { id: 53, rank: 3 }, { id: 3, rank: 5 }, { id: 19, rank: 4 }],
    ranks = [];

array.forEach(a => ranks[a.rank - 1] = a);

console.log(array);
changeRank({ currentRank: 4, newRank: 2 });
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

我认为你可能会错误地接近这个。

为什么不循环遍历所有项目,然后如果等级太大或太大,那么当前的等级会增加它的等级?然后,一旦完成设置更新项目的排名:

这样的事情:

for(var x = 0; x < items.length; x++){
    if(items[x].rank >= item.newRank && items[x].rank <= item.currentRank){
        items[x].rank++;
    }
}
item.rank = item.newRank;

答案 2 :(得分:0)

这种逻辑必须奏效。我已经用数组的概念完成了它。将数组索引视为排名。

if (new_rank < current_rank)
{
    item = arr[current_rank] 
    i = new_rank;  
    temp = arr[i]; 
    i++;

    while(i<current_rank)
    {
        temp1 = arr[i];
        arr[i] = temp;
        temp = temp1;
        i++;
    }

    arr[new_rank] = item;
}

else
{
    item = arr[current_rank] 
    i = new_rank; 
    temp = arr[i]; 
    i--;

    while(i>current_rank)
    {
        temp1 = arr[i];
        arr[i] = temp;
        temp = temp1;
        i--;
    }

    arr[new_rank] = item;
}