我有两个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'
}]
答案 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()
通过从数组中取两个元素 - a
和b
来工作。它根据比较函数的返回值对它们进行排序。如果该函数返回正数,则在a
之后放置b
,如果它为负,a
在b
之前,则它们将保持不变。
在此:
return (a !== undefined) ? (a - b) : 1;
如果a
为undefined
(getEmailValue()
未返回任何内容),则会返回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()
按该对象排序。首先,您需要按recent
中list
或!= 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)