使用_Underscore根据另一个数组对包含对象的数组进行排序

6
我已经阅读了之前的回答,但它并不符合我的需求。
我有一个对象数组,例如:
var Widgets = [
             [{Id: 'abcdef', post_id: 12345}],
             [{Id: 'ghijkl', post_id: 45678}],
             [{Id: 'mnoptq', post_id: 90123}]
];

我有一个第二个数组:
var sortArray = ['ghijkl', 'mnoptq', 'abcdef'];

我需要按照sortArray中元素的初始顺序重新排序小部件。
我已经成功地这样做了。
sortArray.forEach(function(Id) {
                    var found = false;                  
                    Widgets = Widgets.filter(function(Widget) {
                        if(!found && Widget.Id == Id) {
                            NewWidgets.push(Widget);
                            found = true;
                            return false;
                        } else {
                            return true;
                        }
                    });
                });

但我希望通过使用“_SortBy”来改进这段代码,但到目前为止我还没有成功......有什么帮助吗?
任何帮助吗?
编辑
最终结果应该是
var Widgets = [
             [{Id: 'ghijkl', post_id: 45678}],
             [{Id: 'mnoptq', post_id: 90123}],
             [{Id: 'abcdef', post_id: 12345}]
];

3
这句话不太清晰,数组没有顺序,都是一样的吗? - adeneo
@Toucouleur,你想要什么结果? - Oleksandr T.
抱歉,我在复制/粘贴时犯了一个错误,已添加信息。 - Toucouleur
2个回答

5

像这样吗?

sorted = _.sortBy(Widgets, function(x) {
    return _.indexOf(sortArray, x[0].Id)
})

这种方法不是很高效,更快的方式是将sortArray转换为一个对象key=>index,并在sortBy中使用哈希查找:

sortObj = _.invert(_.object(_.pairs(sortArray)));

sorted = _.sortBy(Widgets, function(x) {
    return sortObj[x[0].Id]
})

即使我进行了更改以适应我的需求,它仍然像魅力一样运作良好: sortArray = _.invert(_.object(_.pairs(sortArray)));Widgets = _.sortBy(Widgets, function(Widget) { return sortArray[Widget.objectId]; }); - Toucouleur
我不得不添加 parseInt 来使其正常工作。我相当确定这是因为我的排序数组超过了10个项目,而 sortObj 是一个字符串集合。所以:return parseInt(sortObj[x[0].Id]), 10) - JayRu

0
在@georg的解决方案之上,如果性能对你来说非常重要,并且你必须保留像这样的内容1,那么使用以下方法准备关键字/索引对象会更快:
// Example: ['a', 'b', 'c'] becomes { 'a': 0, 'b': 1, 'c': 2 }
var sortObj = sortArray.reduce(function(acc, value, index) {
  acc[value] = index;
  return acc;
}, {});

// Same as posted by @georg, with no need for `parseInt`
sorted = _.sortBy(Widgets, function(Widget) {
  return sortObj[Widget[0].Id];
});

这段代码可能比 invert/object/pairs 更长,但我认为它更容易阅读。

此外,请注意,使用这种方法不需要 parseInt,因为它构建了一个整数值的对象,而另一种方法则返回字符串。

1 因为我们必须面对一个事实:如果你能够进行更大的重构,那么有其他方法可以优化它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接