在链式函数中,哪一个先执行?

时间:2017-09-26 18:05:49

标签: javascript

说我有一个元素数组,我想对它们进行排序,并过滤它们。我可以用两种方式做到:

let Result = MyArray.sort((a,b) => {
        return b.sortingNum - a.sortingNum
    }).filter((task) => {
        return !task.isWanted
    }
);

let Result = MyArray.filter((task) => {
        return !task.isWanted
    }).sort((a,b) => {
        return b.sortingNum - a.sortingNum
    }
);

两个问题:

  • 在第一种方法中,首先执行哪一种? sortfilter

  • O-Notation有什么好处?我排序然后过滤,或过滤然后排序。我会选择过滤然后排序,因为过滤器需要较少的处理能力来处理更大的数据。但只要把Q放在这里并了解更多。

由于

3 个答案:

答案 0 :(得分:4)

在第一种方法中,sort函数首先执行然后过滤。

复杂性方面,第二种方法会更好,因为我们会对较短长度的数组(过滤后)应用sort。另一方面,过滤器将花费相同的时间复杂度。

答案 1 :(得分:2)

考虑以下示例,并为每个步骤打印:

np.linspace

您可以清楚地看到,链接的函数将按照外观顺序执行。基本上,最后一个函数将应用于前一个函数的结果。

就复杂性而言,最佳方式是首先var MyArray = [ {sortingNum: 10, isWanted: true}, {sortingNum: 12, isWanted: true}, {sortingNum: 2, isWanted: false}, {sortingNum: 8, isWanted: true}, {sortingNum: 11, isWanted: false}, {sortingNum: 6, isWanted: false}, {sortingNum: 7, isWanted: true} ]; console.log( MyArray.sort((a, b) => { console.log("sorting"); return b.sortingNum - a.sortingNum }).filter((task) => { console.log("filtering"); return !task.isWanted }) ); console.log( MyArray.filter((task) => { console.log("filtering"); return !task.isWanted }).sort((a, b) => { console.log("sorting"); return b.sortingNum - a.sortingNum }) );数组,然后应用.filter(),基于过滤删除一些元素的事实,从而使排序具有比排序整个数组然后删除不必要的元素执行更少的比较操作。 在上面的示例中,您可以对7个元素进行排序,然后选择您想要的3个选择所需的3个元素,然后对这3个元素进行排序。

答案 2 :(得分:1)

MyArray.sort(...).filter(...);

相当于

var sorted = MyArray.sort(...);
var filtered = sorted.filter(...);

因此,您会看到filter将如何执行sort的结果,因此必须首先执行sort