与其他列表中的字段对应的订单列表 - 下划线Javascript

时间:2015-05-20 14:22:16

标签: javascript underscore.js

我有两个包含json结构的列表。这些结构具有相应的键(不一定是同名),它们的值都存在于两个结构中,唯一且没有重复。

USE.NAMES

listA = [ {... title:'A' ...}, {... title:'B' ...}, {... title:'C' ...} ]

但订单却不一样。我想重新排序listB = [ {... name:'A' ...}, {... name:'C' ...}, {... name:'B' ...} ],使其符合listA的顺序。

listB

如何使用下划线完成此操作?

3 个答案:

答案 0 :(得分:1)

您可以使用sortByfindIndex的组合:

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;
&#13;
&#13;

答案 2 :(得分:0)

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

  1. 构建name的地图,以便从listB索引。
  2. 使用该地图排序listA
  3. 这可能是这样的:

    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>