【问题标题】:Change the order of the objects in the array using a parameter使用参数更改数组中对象的顺序
【发布时间】:2018-11-05 12:38:20
【问题描述】:

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

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 的元素,然后按顺序排列下一个元素。 字段编号必须始终按顺序排列,只是从哪个项目开始可以有所不同。

我不知道我怎么能做到这一点..

【问题讨论】:

  • 能分享一下最终的目标吗
  • @mehta-rohan 最终目标是主要问题
  • 排列好对象后想要达到什么效果?
  • 这个数组[{number:9},{number:3},{number:100}startBy=3怎么样?

标签: javascript arrays sorting object


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    很简单:

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

    【讨论】:

    • 你假设一个排序数组。
    【解决方案3】:

    好吧,您可以只取出序列的第一个元素,并将其添加到末尾,直到找到正确的元素。

    示例:

    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}
    

    【讨论】:

    • 我认为你误解了卡尔。您删除第一个数组并将其放在最后。新的第一个元素是您正在寻找的元素吗?不?删除第一个元素并添加到末尾。新的第一个元素是您正在寻找的元素吗?是的!
    • 这基本上是队列的入队和出队。
    【解决方案4】:

    假设您的初始数组按number 属性排序,您可以检查该属性是否小于您的startBy,如果条件为真,则删除该元素并推送它

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

    Codepen demo

    【讨论】:

    • 你为什么用map而不是forEach
    【解决方案5】:

    您必须根据您的 number 密钥简单地 sort 您的 arrayMore 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);

    【讨论】:

      【解决方案6】:

      你还可以找到元素在数组中的位置,并将原来的数组移位那么多位置:

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

      【讨论】:

        【解决方案7】:

        注释内嵌代码

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

        【讨论】:

          猜你喜欢
          • 2019-07-16
          • 1970-01-01
          • 2018-06-04
          • 1970-01-01
          • 2019-03-06
          • 1970-01-01
          • 1970-01-01
          • 2020-03-11
          • 1970-01-01
          相关资源
          最近更新 更多