基于另一个对象键的Javascript对象排序

时间:2017-03-01 10:07:30

标签: javascript

我有两个JavaScript对象:

var list = [];
list.push({'xid':'12345@kvm.dooth.com'});
list.push({'xid':'6789@kvm.dooth.com'});
list.push({'xid':'1357@kvm.dooth.com'});
list.push({'xid':'2468@kvm.dooth.com'});

var recent = [];
recent.push({'12345@kvm.dooth.com':3});
recent.push({'1357@kvm.dooth.com':1});
recent.push({'2468@kvm.dooth.com':2});

我需要使用list对象对recent对象进行排序。我期待输出如:

[{
  'xid': '1357@kvm.dooth.com'
}, {
  'xid': '2468@kvm.dooth.com'
}, {
  'xid': '12345@kvm.dooth.com'
}, {
  'xid': '6789@kvm.dooth.com'
}]

3 个答案:

答案 0 :(得分:0)

const sortedList = list.sort((a, b) => {
  // The ids
  const aXid = a.xid
  const bXid = b.xid

  // The positions
  const [aPos] = recent.filter(e => e.hasOwnProperty(aXid)).map(e => e[aXid])
  const [bPos] = recent.filter(e => e.hasOwnProperty(bXid)).map(e => e[bXid])

  // Compare like usual numbers
  return (aPos || Number.MAX_SAFE_INTEGER) - (bPos || Number.MAX_SAFE_INTEGER)
})

答案 1 :(得分:0)

我使用Array.prototype.sort()Array.prototype.find()



var list = [];
list.push({'xid':'12345@kvm.dooth.com'});
list.push({'xid':'6789@kvm.dooth.com'});
list.push({'xid':'1357@kvm.dooth.com'});
list.push({'xid':'2468@kvm.dooth.com'});

var recent = [];
recent.push({'12345@kvm.dooth.com':3});
recent.push({'1357@kvm.dooth.com':1});
recent.push({'2468@kvm.dooth.com':2});

function sort(list, recent){
  list.sort(function (a, b) {
    a = getEmailValue(recent, a["xid"]);
    b = getEmailValue(recent, b["xid"]);
    return (a !== undefined) ? (a - b) : 1;
  });
}

function getEmailValue(recent, email) {
  var elem = recent.find(function (e) {
    return e[email] !== undefined;
  });

  return elem && elem[email];
}

sort(list, recent);
console.log(list);




sort()通过从数组中取两个元素 - ab来工作。它根据比较函数的返回值对它们进行排序。如果该函数返回正数,则在a之后放置b,如果它为负,ab之前,则它们将保持不变。

在此:

return (a !== undefined) ? (a - b) : 1;

如果aundefinedgetEmailValue()未返回任何内容),则会返回1以对其进行排序。在您的示例中,recent中没有值的电子邮件位于列表的底部。

此:

return elem && elem[email];

如果elem[email]不是elem,则会返回undefined,否则会返回undefined。这是一种阻止访问非对象的email属性的方法。有关详情,请查看here

  

逻辑AND(&&) - expr1&& expr2 - 如果可以转换为false,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,&&如果两个操作数都为真,则返回true;否则,返回false。

答案 2 :(得分:0)

您可以先从recent数组创建一个对象或哈希表,然后使用sort()按该对象排序。首先,您需要按recentlist!= undefined中存在的值排序,然后按最近对象中的值排序。



var list = [];
list.push({'xid':'12345@kvm.dooth.com'});
list.push( {'xid':'6789@kvm.dooth.com'});
list.push( {'xid':'1357@kvm.dooth.com'});
list.push({'xid':'2468@kvm.dooth.com'});

var recent = [];
recent.push({'12345@kvm.dooth.com':3});
recent.push({'1357@kvm.dooth.com':1});
recent.push({'2468@kvm.dooth.com':2});

var hash = recent.reduce(function(r, e) {
  for(var i in e) r[i] = e[i]
  return r
}, {})

var result = list.sort(function(a, b) {
  return ((hash[b.xid] != undefined) - (hash[a.xid] != undefined)) || 
  	 (hash[a.xid] - hash[b.xid])
})

console.log(result)