Изменить порядок объектов в массиве с помощью параметра - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть массив таких объектов:

const arr = [
  {number: 1, value: 50},
  {number: 2, value: 4},
  {number: 3, value: 33},
  {number: 4, value: 49},
  {number: 5, value: 92},
  {number: 6, value: 1},
  {number: 7, value: 49},
]

и

const startBy = 3

тогда я хочу другой массив, подобный этому:

const newArr = [
  {number: 3, value: 33},
  {number: 4, value: 49},
  {number: 5, value: 92},
  {number: 6, value: 1},
  {number: 7, value: 49},
  {number: 1, value: 50},
  {number: 2, value: 4},
]

то есть я хочу «переставить» элементы массива так, чтобы первый элемент был элементом с номером поля, равным startBy, а затем следующим по порядку. Номер поля всегда должен быть в порядке, только то, что может отличаться от того, с какого элемента начинать.

Я не знаю, как я могу это сделать ..

Ответы [ 7 ]

0 голосов
/ 05 ноября 2018

Вы также можете найти, где элемент находится в массиве, и сместить исходный массив на столько позиций:

const arr = [{
    number: 1,
    value: 50
  },
  {
    number: 2,
    value: 4
  },
  {
    number: 3,
    value: 33
  },
  {
    number: 4,
    value: 49
  },
  {
    number: 5,
    value: 92
  },
  {
    number: 6,
    value: 1
  },
  {
    number: 7,
    value: 49
  },
]

const findPosition = (array, startBy) => {
  for (let i = 0; i < array.length; i++) {
    if (array[i].number == startBy) {
      return i;
    }
  }
}

const shiftArray = (array, positions) => {
  for (let i = 0; i < positions; i++) {
    const first = array.shift();
    array.push(first);
  }
  return array;
}

console.log(shiftArray(arr, findPosition(arr, 3)));
0 голосов
/ 05 ноября 2018

Комментарии Встроенный код

let arr = [{number: 1, value: 50},{number: 2, value: 4},{number: 3, value: 33},{number: 4, value: 49},{number: 5, value: 92},{number: 6, value: 1},{number: 7, value: 49}]

// sort the array by number value

arr.sort((a,b) => a.number - b. number)

// push into new array via reduce every element until you find your starting number and then from there insert everything thereafter into new array at starting position by Array.unshift()

function startFromNumber(number) {
  return arr.slice(0).reduce((a, d, i, arrC) =>
    (d.number == number 
      ? (a.unshift(...arrC.slice(i)), arrC.length = 0) 
      : a.push(d)
    , a), [])
  
}

console.log(startFromNumber(3))
console.log(startFromNumber(5))
0 голосов
/ 05 ноября 2018

Вы должны просто sort ваш array на основе вашего ключа number. Подробнее о сортировке

const arr = [
  {number: 1, value: 50},
  {number: 2, value: 4},
  {number: 3, value: 33},
  {number: 4, value: 49},
  {number: 5, value: 92},
  {number: 6, value: 1},
  {number: 7, value: 49},
]

arr.sort((a,b) => {
  return (a.number < 3) - (b.number < 3) || (a.number-b.number)
})
console.log(arr);
0 голосов
/ 05 ноября 2018

Предполагая, что ваш исходный массив отсортирован по свойству number, вы можете проверить, меньше ли это свойство, чем ваше startBy, и если условие истинно, удалить этот элемент и нажать на него

arr.map(o => {
  if (o.number < startBy) {
    arr.push(arr.shift());
  }
});

console.log(arr);

Кодовая демонстрация

0 голосов
/ 05 ноября 2018

Вы можете принять значение в качестве проверки для дельты, если значение меньше, чем заданное значение. В противном случае сортировка по дельте.

function sortBy(array, first) {
    array.sort(function (a, b) {
       return (a.number < first) - (b.number < first) || a.number - b.number;
    });
    return array;
}

const array = [{ number: 1, value: 50 }, { number: 2, value: 4 }, { number: 3, value: 33 }, { number: 4, value: 49 }, { number: 5, value: 92 }, { number: 6, value: 1 }, { number: 7, value: 49 }];
console.log(sortBy(array, 3));
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 05 ноября 2018

Довольно просто:

  1. Просто отсортируйте массив,
  2. затем найдите, где разбить ваш массив с помощью findIndex,
  3. и, наконец, slice массив из двух частей, чтобы создать новый;)

const arr = [
  {number: 1, value: 50},
  {number: 2, value: 4},
  {number: 3, value: 33},
  {number: 4, value: 49},
  {number: 5, value: 92},
  {number: 6, value: 1},
  {number: 7, value: 49},
];
const startBy = 3;

//Presorting the input array.
const sortedArray = arr.sort((a, b) => a.number-b.number);

//Finding the split index.
const splitIndex = sortedArray.findIndex(elt => elt.number === startBy);

//Slicing the array and creating a new one.
const result = [...sortedArray.slice(splitIndex), ...sortedArray.slice(0, splitIndex)];
console.log(result);
0 голосов
/ 05 ноября 2018

Ну, вы можете просто вынуть первый элемент последовательности и добавить его в конец, пока не найдете правильный элемент.

пример:

const arr = [
  {number: 1, value: 50},
  {number: 2, value: 4},
  {number: 3, value: 33},
  {number: 4, value: 49},
  {number: 5, value: 92},
  {number: 6, value: 1},
  {number: 7, value: 49},
]
undefined
function ReturnNewArray(array, value){
    while(array[0].number!=value){
        array.push(array.shift())
    }
    return array;
}
undefined
ReturnNewArray(arr,3);

0: {number: 3, value: 33}
1: {number: 4, value: 49}
2: {number: 5, value: 92}
3: {number: 6, value: 1}
4: {number: 7, value: 49}
5: {number: 1, value: 50}
6: {number: 2, value: 4}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...