其他列表字段对应的顺序列表 - 下划线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>

您可以使用 sortBy and findIndex:

的组合
var result = _.sortBy(lista, function(value){
    return _.findIndex(listb, { name: value.title });
});

listB 的元素可以通过有效的对象键来很好地识别,所以我将分两步进行:

  1. 构建 name 的映射到 listB 的索引。
  2. 使用该地图对 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>