2016-10-04 80 views
0

我需要基于另一个数组对数组进行排序。但是,有一个更大的数组,但我只想对某些项目属性进行排序。第一个数组是这样的:从另一个数组中排序数组的一部分

var data = [ { id : "23", name : "Item 1", isActive : true}, 
    { id : "25", name : "Item 2", isActive : false}, 
    { id : "26", name : "Item 3", isActive : false}, 
    { id : "30", name : "Item 4", isActive : true}, 
    { id : "45", name : "Item 5", isActive : true} 
] 

然后,我这样做是为了获取有效项目的ID:

我做一些操作(数据库comparaison),我得到例如这样的结果:

var sorted = ["45","23","30"] 

当我第一次按isActive排序项目时,我只想对活动的项目进行排序。 (取决于数组排序上面)像这样:

var expected = [ 
    { id : "45", name : "Item 5", isActive : true}, 
    { id : "23", name : "Item 1", isActive : true}, 
    { id : "30", name : "Item 4", isActive : true}, 
    //try to keep order for the last values 
    { id : "25", name : "Item 2", isActive : false}, 
    { id : "26", name : "Item 3", isActive : false}] 

我试图用_.sortBy的方法,但如预期这并没有工作:但

var sortObj = sorted.reduce(function(acc, value, index) { 
    acc[value] = value; 
    return acc; 
}, {}); 

sortedItems = _.sortBy(data, function(x) { 
    return _.indexOf(sortObj, x.id) 
}); 

如预期没有奏效

任何想法?非常感谢提前=)

+0

我不知道理解那种类型的,你需要什么 –

+0

你想先所有活动项目,然后活性,但保持第一顺序? –

+0

https://github.com/Teun/thenBy.js –

回答

0

当你想保持顺序排序,不活动,。 我们可以使用两个关联的数组来保存顺序的索引,然后可以使用这两个关联的数组来创建一种合成索引。

更新:希望简化和使easer遵循。

var data = [ { id : "23", name : "Item 1", isActive : true}, 
 
    { id : "25", name : "Item 2", isActive : false}, 
 
    { id : "26", name : "Item 3", isActive : false}, 
 
    { id : "30", name : "Item 4", isActive : true}, 
 
    { id : "45", name : "Item 5", isActive : true} 
 
]; 
 
var sorted = ["45","23","30"]; 
 

 
//true = active sort, false = data sort 
 
var order = { true: {}, false: {}}; 
 
//create order index for data 
 
data.forEach(function (o, i) { order[false][o.id] = i; }); 
 
//create order index for sort 
 
sorted.forEach(function (v, i) { order[true][v] = i }); 
 

 
data.sort(function (a, b) { 
 
    return (b.isActive - a.isActive) || 
 
    order[a.isActive][a.id] - order[b.isActive][b.id]; 
 
}); 
 

 
console.log(data);

+0

作为魅力工作谢谢 – TLR

0

您可以运行2个过滤器,并将结果组合成一个数组。 return el.isActive === true;并返回el.isActive === false; 你可以插入到最终阵列

0

您可以使用地图和排序顺序一种物品分拣前两个结果进行排序。

var data = [{ id: "23", name: "Item 1", isActive: true }, { id: "25", name: "Item 2", isActive: false }, { id: "26", name: "Item 3", isActive: false }, { id: "30", name: "Item 4", isActive: true }, { id: "45", name: "Item 5", isActive: true }], 
 
    sorted = ["45", "23", "30"], 
 
    order = {}; 
 

 
sorted.forEach(function (a, i) { order[a] = i + 1; }); 
 

 
// temporary array holds objects with position and sort-value 
 
var mapped = data.map(function (el, i) { 
 
     return { index: i, active: el.isActive, value: order[el.id] || i }; 
 
    }); 
 

 
// sorting the mapped array containing the reduced values 
 
mapped.sort(function (a, b) { 
 
    return b.active - a.active || a.value - b.value; 
 
}); 
 

 
// container for the resulting order 
 
var result = mapped.map(function (el) { 
 
     return data[el.index]; 
 
    }); 
 

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

+0

这并没有考虑到,没有积极排序..虽然它显示25,26,这只是偶然。 – Keith

+0

我不理解你。你需要什么? –

+0

如果你看他的需求,他说.. //尝试保持最后值的顺序,你正确地执行数组排序的顺序,但不做任何事情以确保不在排序数组中的项保持相同订单为原始数组。希望有道理.. :) – Keith

相关问题