Обновление порядка сортировки массива на основе пользовательского ввода - PullRequest
0 голосов
/ 23 октября 2019

Мне нужно написать функцию javascript, которая позволяет пользователю вводить порядок сортировки, куда он хочет, чтобы объект перемещался, и затем фиксировать позицию, которая имеет этот порядок сортировки в то время

var object = [{
  sortOrder: 4,
  id: "braves"
},{
  sortOrder: 2,
  id: "cubs"
},{
  sortOrder: 3,
  id: "marlins"
},{
  sortOrder: 1,
  id: "mets"
}]

Пользовательзапросить, чтобы id: "braves" был перемещен в sortOrder: 1.

Таким образом, он поместит "braves" в sortOrder 1, а затем добавит 1 к метам, детенышам, марлинам, и порядок будет: braves, mets, cubs, marlins сейчас.

Я посмотрел на функцию sort (), но, похоже, она просто сортирует ее. И если у метов и у храбрых сейчас sortOrder равен 1, то как он узнает, какой из них должен быть первым по сравнению со вторым?

Как лучше всего справиться с этим в jquery / javascript

Ответы [ 3 ]

2 голосов
/ 23 октября 2019

Вы можете использовать map .

const object = [
    {
        sortOrder: 4,
        id: 'braves',
    },
    {
        sortOrder: 2,
        id: 'cubs',
    },
    {
        sortOrder: 3,
        id: 'marlins',
    },
    {
        sortOrder: 1,
        id: 'mets',
    },
];

function sortObject(id, nextSortOrder) {
    return object.map((o) => {
        if (o.id === id) {
            return Object.assign({}, o, { sortOrder: nextSortOrder });
        }

        return Object.assign({}, o, {
            sortOrder: o.sortOrder === object.length ? 1 : o.sortOrder + 1,
        });
    });
}

const sortedObject = sortObject('brave', 1);
console.log(sortedObject);
2 голосов
/ 23 октября 2019

Вы можете попробовать это,

function moveOrder(id,position){
    object.find(item=>item.id===id).sortOrder=position;
    object.forEach(item=>{
        if(item.id!==id && item.sortOrder>=position)
            item.sortOrder=item.sortOrder+1;
    })
}
1 голос
/ 23 октября 2019

Вы можете отобразить ваш текущий массив объектов на новый массив объектов с каждым приращением sortOrder, если оно больше или равно предоставленному sortOrder. Затем вы можете найти объект в вашем массиве с id, равным предоставленному id, используя .find(), так что вы можете изменить его sortOrder на предоставленный sortOrder. Наконец, вы можете прибегнуть к новому массиву:

function sortArr(arr, _sortOrder, _id) {
  const new_arr = arr.map(({sortOrder, ...r}) => sortOrder >= _sortOrder ? {...r, sortOrder: sortOrder+1} : {...r, sortOrder});
  const obj = new_arr.find(({id}) => id === _id);
  obj.sortOrder = _sortOrder;
  
  return new_arr.sort(({sortOrder:a}, {sortOrder:b}) => b-a);;
}

const arr = [{sortOrder:4,id:"braves"},{sortOrder:2,id:"cubs"},{sortOrder:3,id:"marlins"},{sortOrder:1,id:"mets"}];

console.log(sortArr(arr, 1, "braves"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...