其他列表字段对应的顺序列表 - 下划线Javascript
Order list corresponding to field in other list - Underscore Javascript
我有两个包含 json 结构的列表。这些结构具有相应的键(不一定是相同的名称),其值都存在于两个结构中,唯一且无重复。
listA = [ {... title:'A' ...}, {... title:'B' ...}, {... title:'C' ...} ]
listB = [ {... name:'A' ...}, {... name:'C' ...}, {... name:'B' ...} ]
但是顺序不一样。我想重新排序 listA
使其对应于 listB
.
的顺序
listA = [ {... title:'A' ...}, {... title:'C' ...}, {... title:'B' ...} ]
如何使用下划线完成此操作?
暴力破解:)点击下面的"Run code snippet"。
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>
的组合
var result = _.sortBy(lista, function(value){
return _.findIndex(listb, { name: value.title });
});
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>
我有两个包含 json 结构的列表。这些结构具有相应的键(不一定是相同的名称),其值都存在于两个结构中,唯一且无重复。
listA = [ {... title:'A' ...}, {... title:'B' ...}, {... title:'C' ...} ]
listB = [ {... name:'A' ...}, {... name:'C' ...}, {... name:'B' ...} ]
但是顺序不一样。我想重新排序 listA
使其对应于 listB
.
listA = [ {... title:'A' ...}, {... title:'C' ...}, {... title:'B' ...} ]
如何使用下划线完成此操作?
暴力破解:)点击下面的"Run code snippet"。
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>
var result = _.sortBy(lista, function(value){
return _.findIndex(listb, { name: value.title });
});
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>