使用参数更改数组中对象的顺序

时间:2018-11-05 12:38:21

标签: javascript arrays sorting object

我有一个这样的对象数组:

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 :(得分:5)

如果该值小于给定值,则可以将其用作增量检查。否则按增量排序。

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; }

答案 1 :(得分:3)

非常简单:

  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);

答案 2 :(得分:2)

好吧,您只需取出序列的第一个元素,然后将其添加到末尾,直到找到正确的元素为止。

示例:

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}

答案 3 :(得分:0)

假设您的初始数组按number属性排序,则可以检查该属性是否小于startBy,并且如果条件为true,则删除该元素并将其压入

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

console.log(arr);
  

Codepen demo

答案 4 :(得分:0)

您只需要根据sortarray numberMore About sort

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);

答案 5 :(得分:0)

您还可以找到元素在数组中的位置,并将原始数组移动许多位置:

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)));

答案 6 :(得分:0)

注释内联代码

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))