按特定顺序按数字对对象数组进行排序

时间:2020-06-03 13:17:21

标签: javascript

我有以下数组ob对象:

let given = [
{id: 1, number: 43},
{id: 2, number: 0},
{id: 3, number: 3},
{id: 4, number: undefined},
{id: 5, number: 1},
{id: 6, number: 0},
{id: 7, number: 0},
{id: 8, number: 36},
{id: 69, number: 0}
]

并希望以这种方式对其进行排序

let expected = [
{id: 1, number: 43},
{id: 3, number: 3},
{id: 4, number: undefined}, 
{id: 5, number: 1},
{id: 8, number: 36},
{id: 2, number: 0},
{id: 6, number: 0},
{id: 7, number: 0},
{id: 69, number: 0}
]

所有数字为0的对象应位于数组的末尾,但先前的顺序应仍然存在

我尝试了array.sort(),但没有收到期望的结果

7 个答案:

答案 0 :(得分:3)

您首先要过滤非零对象,而不是零对象。然后连接两个数组。

let given = [
{id: 1, number: 43},
{id: 2, number: 0},
{id: 3, number: 3},
{id: 4, number: undefined},
{id: 5, number: 1},
{id: 6, number: 0},
{id: 7, number: 0},
{id: 8, number: 36},
{id: 69, number: 0}
]

const expected = [
  ...given.filter(item => item.number !== 0),
  ...given.filter(item => item.number === 0)
]

console.log(JSON.stringify(expected))

或者,如果您认为两个循环可能会影响您的应用性能,则可以使用一个循环。

答案 1 :(得分:2)

您可以将支票的差额排序为零。

let given = [{ id: 1, number: 43 }, { id: 2, number: 0 }, { id: 3, number: 3 }, { id: 4, number: undefined }, { id: 5, number: 1 }, { id: 6, number: 0 }, { id: 7, number: 0 }, { id: 8, number: 36 }, { id: 69, number: 0 }];

given.sort(({ number: a }, { number: b }) => (a === 0) - (b === 0));

console.log(given);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:1)

您可以将给定的数组分为2个,零个和noneZeros,同时保留Array.reduce的原始顺序。

let given = [
  {id: 1, number: 43},
  {id: 2, number: 0},
  {id: 3, number: 3},
  {id: 4, number: undefined},
  {id: 5, number: 1},
  {id: 6, number: 0},
  {id: 7, number: 0},
  {id: 8, number: 36},
  {id: 69, number: 0},
];

const x = given.reduce(
  (result, item) => {
    if (item.number === 0) {
      result.zeros.push(item);
    } else {
      result.noneZeros.push(item);
    }
    return result;
  },
  {zeros: [], noneZeros: []}
);

console.log(x.noneZeros.concat(x.zeros));

答案 3 :(得分:0)

您可以使用两个数组进行

let given = [
{id: 1, number: 43},
{id: 2, number: 0},
{id: 3, number: 3},
{id: 4, number: undefined},
{id: 5, number: 1},
{id: 6, number: 0},
{id: 7, number: 0},
{id: 8, number: 36},
{id: 69, number: 0}
]
var a = []; 
var b = [];
for(let data of given){
	if(data.number == 0){
  	a.push(data)
  } else {
  	b.push(data)
  }
}
var c = b.concat(a);
console.log(c)

答案 4 :(得分:0)

使用带回调功能的排序:

given.sort((a,b) => b.number === 0 && a.number !== 0 ? -1 : 0);

答案 5 :(得分:0)

let given = [
  { id: 1, number: 43 },
  { id: 2, number: 0 },
  { id: 3, number: 3 },
  { id: 4, number: undefined },
  { id: 5, number: 1 },
  { id: 6, number: 0 },
  { id: 7, number: 0 },
  { id: 8, number: 36 },
  { id: 69, number: 0 },
];

var zeroarray = given.filter((val) => {
  if (val.number === 0) return val;
});

var nonzeroarray = given.filter((val) => {
  if (val.number != 0) return val;
});
var final=[...nonzeroarray,...zeroarray];
 console.log(final);

答案 6 :(得分:0)

let given = [
{id: 1, number: 43},
{id: 2, number: 0},
{id: 3, number: 3},
{id: 4, number: undefined},
{id: 5, number: 1},
{id: 6, number: 0},
{id: 7, number: 0},
{id: 8, number: 36},
{id: 69, number: 0}
]

var arr = []

for(var i = 0; i < given.length; i++){
  if(given[i].number === 0){
    arr.push(given[i]);
  }
}

given = given.filter(item => item.number !== 0);

given = given.concat(arr)

console.log(given)