JS将一个数组元素推到末尾

时间:2018-10-29 09:02:23

标签: javascript ecmascript-6 lodash

我正在尝试重新排列数组的排序。 假设我具有以下结构

    const array = [{
     location: 'Table 2',
     data: {..}
    }, {
     location: 'Unassigned',
     data: {..}
    }, {
     location: 'Table 1',
     data: {..}
}
];

将“表1”移到索引0,紧随其后的“表2”(对表3、4等保持相同的顺序)并始终“未分配”的正确方法是什么?最好搭配lodash。

这是我到目前为止尝试过的

  forEach(allItemsSorted, (item, index) => {
    const total = allItemsSorted.length;
    let hasUnassigned = false;
    if (item.location === 'Unassigned') {
      allItemsSorted[total] = item;
      hasUnassigned = true;
    }
    if (hasUnassigned && index === total) {
      return;
    }
    allItemsSorted[index] = item;
  })

5 个答案:

答案 0 :(得分:1)

您可以使用一个对象来获取所需的订单,并使用默认值来获取未知值,以便将该项目移动到数组的末尾。

@Configuration
@EnableWebFlux
public class MyConfiguration implements WebFluxConfigurer {
}
const
    array = [{ location: 'Table 2', data: {} }, { location: 'Unassigned', data: {} }, { location: 'Table 1', data: {} }],
    order = { 'Table 1': 1, 'Table 2': 2, default: Infinity };

array.sort(({ location: a }, { location: b }) =>
    (order[a] || order.default) - (order[b] || order.default));

console.log(array);

对于仅按升序对所有.as-console-wrapper { max-height: 100% !important; top: 0; }末尾和所有其他值进行排序,您也可以使用上述order对象,但是已知和未知字符串的值都会更改。

'Unassigned'
const
    array = [{ location: 'Table 2', data: {} }, { location: 'Unassigned', data: {} }, { location: 'Table 1', data: {} }],
    order = { Unassigned: 1 };

array.sort(({ location: a }, { location: b }) =>
    (order[a] || 0) - (order[b] || 0) || a.localeCompare(b));

console.log(array);

答案 1 :(得分:1)

您可以使用Array.sort()-始终将FIRMessaging移动到末尾(两个Unassigned)。使用String.localeCompare()numeric option对其他项目进行排序。

注意::我使用array spread-if-克隆数组,因此原始数组不会发生突变。如果要更改原始数组,可以跳过。

[...array]

答案 2 :(得分:1)

如果您有以array开头的location个值,而未分配的值为Table,那么如何对Unassigned进行排序。将适用于这种情况。但是要小心其他值,除非它们是您想要的结果。

const array = [{location:'Table 2', data: {}}, {location: 'Unassigned', data: {}}, {location: 'Table 1', data: {}}];
array.sort(function(a,b){
  return a.location.localeCompare(b.location);
});
console.log(array);

答案 3 :(得分:1)

如果您想重新排列数组,请始终寻找Array.sort方法。创建具有自定义添加功能的新阵列只会带来困难。

您可以尝试以下操作:

  • 创建一个接受location并返回数值的函数。
  • 使用此值可以按您希望的任何顺序进行排序。

const array = [
  {location:'Table 2', data: {}},
  {location: 'Unassigned', data: {}},
  {location: 'Table 1', data: {}},
  {location: 'Table 11', data: {}},
  {location: 'Table 31', data: {}},
  {location: 'Table 3', data: {}},
];

array.sort(function(a,b) {
  return getSortValue(a.location) - getSortValue(b.location);
});

function getSortValue(location) {
  return location === 'Unassigned' ? Number.MAX_SAFE_INTEGER : location.match(/\d+/)[0];
}

console.log(array)

答案 4 :(得分:0)

怎么样

var data1 = [{location:'Table 2', data: {}}, {location: 'Unassigned', data: {}}, {location: 'Table 1', data: {}}, {location: 'Table 12', data: {}}, {location: 'Table 22', data: {}}, {location: 'Unassigned', data: {}}];

data.sort((a,b)=> a.location > b.location).filter(item => item.location != 'Unassigned').push([...data.filter(item => item.location == 'Unassigned')]);

结果

[{
"location": "Table 1",
"data": {}
},
{
"location": "Table 12",
"data": {}
},
{
"location": "Table 2",
"data": {}
},
{
"location": "Table 22",
"data": {}
},
{
"location": "Unassigned",
"data": {}
},
{
"location": "Unassigned",
"data": {}
}]