根据键值对对象数组进行排序或排序

时间:2017-12-17 18:21:31

标签: javascript arrays sorting

我有一个包含对象的数组,每个对象都有以下属性:

{ country: 'United States' },
{ country: 'Netherlands' },
{ country: 'Spain' },
{ country: 'Spain' },

我想对数组进行排序,以便第一个值为'西班牙'然后展示所有其他人。我尝试使用array.sort但似乎无法正常工作。不确定我做错了什么。

到目前为止,我尝试了这个

arr.sort(function(a, b) {return a.country === 'Spain'})

arr.sort(function(a, b) {if (a.country === 'Spain') {return 1}})

3 个答案:

答案 0 :(得分:3)

你可以检查字符串,你想排序到顶部并取得比较的增量。

其他国家/地区的排序顺序并不稳定。

var array = [{ country: 'United States' }, { country: 'Netherlands' }, { country: 'Spain' }, { country: 'Spain' }];

array.sort(function (a, b) {
    return (b.country === 'Spain') - (a.country === 'Spain');
});

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

对于稳定排序,将'Spain'排序到顶部,其余按原始索引排序,您可以使用sorting with map

var array = [{ country: 'United States' }, { country: 'Netherlands' }, { country: 'Spain' }, { country: 'Spain' }],
    sorted = array
        .map(function (o, i) {
            return { top: o.country === 'Spain', index: i };
        })
        .sort(function (a, b) {
            return b.top - a.top || a.index - b.index;
        })
        .map(function (o) {
            return array[o.index];
        });

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

答案 1 :(得分:1)

不需要实际排序。把它分成两个不同的数组,然后将它们组合起来。

这也保证了原始子订单的维护。

var data = [{"country":"United States"},{"country":"Netherlands"},{"country":"Spain"},{"country":"Spain"}];

var res = [].concat(...data.reduce((res, obj) =>
  (res[obj.country === "Spain" ? 0 : 1].push(obj), res)
, [[],[]]));

console.log(res);

如果你需要改变原作,那就这样做:

var data = [{"country":"United States"},{"country":"Netherlands"},{"country":"Spain"},{"country":"Spain"}];

var res = Object.assign(data, [].concat(...data.reduce((res, obj) =>
  (res[obj.country === "Spain" ? 0 : 1].push(obj), res)
, [[],[]])));

console.log(data);

答案 2 :(得分:1)

使用Javascript数组函数应该相当容易,尤其是sort()filter()reverse()

var json = [
  {
    country: 'United States'
  },
  {
    country: 'Netherlands'
  },
  {
    country: 'Spain'
  },
  {
    country: 'Spain'
  }
];

var sorted = 
  // Spain Terms First
  json.filter(j => j.country === 'Spain')
  // Add Alphabetically-Sorted Other Terms
  .concat(json.filter(j => j.country !== 'Spain').sort().reverse()); 
  
console.log(sorted);