необходимо переупорядочить список объектов на основе индекса в угловом приложении js

0

В моем приложении angularjs у меня есть следующий список объектов.

$scope.itemsList = [
  {  
    "setupId": "T_2893",   
    "name" : "abc"

  },
  {   
    "setupId": "LBT826",   
    "name" : "xyz"

  },
  {   
    "setupId": "LBT1252",
   "name" : "pqr"

  },
  {   
    "setupId": "G1252",
   "name" : "dwr"

  }
] 

Теперь, когда я вызываю функцию $ scope.changeOreder(1, 3), она должна переупорядочить объекты на основе предыдущего и следующего индекса. поэтому список должен быть следующим.

  $scope.itemsList = [
      {  
        "setupId": "T_2893",   
        "name" : "abc"

      },      
      {   
        "setupId": "LBT1252",
       "name" : "pqr"

      },
      {   
        "setupId": "G1252",
       "name" : "dwr"

      },
       {   
        "setupId": "LBT826",   
        "name" : "xyz"

      }
    ] 

Теперь, если я позвоню, $scope.changeOreder(2, 0), новый список должен быть,

$scope.itemsList = [
          {   
            "setupId": "G1252",
           "name" : "dwr"

          },
          {  
            "setupId": "T_2893",   
            "name" : "abc"

          },      
          {   
            "setupId": "LBT1252",
           "name" : "pqr"

          },          
           {   
            "setupId": "LBT826",   
            "name" : "xyz"

          }
        ] 

В моей функции $ scope.changeOrder я пробовал разные способы, например, взять резервную копию объекта в prevIndex, а затем удалить obj в prevIndex чтобы вставить prevIndex копию obj в newIndex, но поскольку я удалил объект, то newIndex не более актуальным в текущем списке !!!. Подобным образом я пробовал разные способы, но окончательный список не упорядочивается так, как я ожидаю. Может ли кто-нибудь помочь мне в ее исправлении.

  • 0
    Почему бы не создать новый массив с переупорядоченными объектами, а затем просто сделать старый массив равным новому, как только вы закончите?

1 ответ

2

Перемещение элемента в указанный индекс:

var items = [
          {   
            "setupId": "G1252",
           "name" : "dwr"

          },
          {  
            "setupId": "T_2893",   
            "name" : "abc"

          },      
          {   
            "setupId": "LBT1252",
           "name" : "pqr"

          },          
           {   
            "setupId": "LBT826",   
            "name" : "xyz"

          }
        ];


function moveItem(posA, posB) {
  /*
  * If an item is moved from a higher index to a lower index, then we need to
  * remove the current item first, then add it.
  * When moving a item from a low index to a higer index, then we need to add
  * the item first, then delete it.
  */
  var upToDown = posA > posB;


  var itemToMove = items[posA];
  //Make copy first
  var tmpList = items.slice(0); 

  if (!upToDown) {
      //Add item to specified index
    tmpList.splice(posB+1, 0, itemToMove); 

    //Remove the old item
    tmpList.splice(posA, 1); 
  } else { 
    //Remove the old item
    tmpList.splice(posA, 1); 
      //Add item to specified index
    tmpList.splice(posB, 0, itemToMove);

  }
  return tmpList;
} 

var result = moveItem(0, 3); 
console.log(result);  

Plunk: https://plnkr.co/edit/23DGzcXBEY7qrqFWsQNA?p=preview

  • 0
    Если вы хотите изменить существующий массив, добавив / удалив элементы, то я рекомендую использовать angular.copy() docs.angularjs.org/api/ng/function/angular.copy.
  • 0
    Это очень простое решение для обмена предметами. Проблема в опубликованном вопросе заключалась в том, что элементы были удалены, что не нужно, если меняется только их содержание.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню