我有两个包含json结构的列表。这些结构具有相应的键(不一定是同名),它们的值都存在于两个结构中,唯一且没有重复。
USE.NAMES
listA = [ {... title:'A' ...}, {... title:'B' ...}, {... title:'C' ...} ]
但订单却不一样。我想重新排序listB = [ {... name:'A' ...}, {... name:'C' ...}, {... name:'B' ...} ]
,使其符合listA
的顺序。
listB
如何使用下划线完成此操作?
答案 0 :(得分:1)
var result = _.sortBy(lista, function(value){
return _.findIndex(listb, { name: value.title });
});
答案 1 :(得分:0)
蛮力回答:)点击"运行代码段"下方。
var lista= [{title: 'one'}, {title: 'three'}, {title: 'two'}];
var listb= [{name: 'one'}, {name: 'two'}, {name: 'three'}];
function reorder(a,b) {
return b.reduce(function(result, item) {
result.push(_.find(a, function(ana) {
return ana.title === item.name;
}));
return result;
}, []);
}
document.body.appendChild(document.createTextNode(JSON.stringify(reorder(lista, listb))));

<script src="http://underscorejs.org/underscore-min.js"></script>
<body>
</body>
&#13;
答案 2 :(得分:0)
listB
的元素可以通过有效的对象键很好地识别,所以我分两步完成:
name
的地图,以便从listB
索引。listA
。这可能是这样的:
var indexes = _(listB).reduce(function(m, e, i) {
m[e.name] = i;
return m;
}, { });
var sorted = _(listA).sortBy(function(e) { return indexes[e.title] });
这样,您只需通过listB
一次,而不是一遍又一遍地搜索。
var listA = [
{ title: 'A' },
{ title: 'B' },
{ title: 'C' }
];
var listB = [
{ name: 'A' },
{ name: 'C' },
{ name: 'B' }
];
var indexes = _(listB).reduce(function(m, e, i) {
m[e.name] = i;
return m;
}, { });
var sorted = _(listA).sortBy(function(e) { return indexes[e.title] });
console.log(sorted);
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>