【发布时间】:2017-08-14 06:24:29
【问题描述】:
假设我已经有一个包含这些文章的数组,按最低到最高价格排序:
[
{ title: "Article 3", price: 1.49 },
{ title: "Article 1", price: 3.00 },
{ title: "Article 4", price: 5.99 },
{ title: "Article 2", price: 19.99 }
]
基本上我想在正确的位置(按价格)将另一篇文章推送到数组中。我该怎么做?
我推送的新文章可能有以下属性:
{ title: "Article 5", price: 12.00 }
我希望文章出现在索引 3(文章 4 和 2 之间)。
更新(解决方案)
我使用@klutt 的答案和二进制搜索算法创建了一个原型方法:
Array.prototype.pushSorted = function(el, compareFn) {
this.splice((function(arr) {
var m = 0;
var n = arr.length - 1;
while(m <= n) {
var k = (n + m) >> 1;
var cmp = compareFn(el, arr[k]);
if(cmp > 0) m = k + 1;
else if(cmp < 0) n = k - 1;
else return k;
}
return -m - 1;
})(this), 0, el);
return this.length;
};
const sortByPrice = (a, b) => a.price > b.price;
theArray.pushSorted({ title: "Article 5", price: 12.00 }, sortByPrice);
【问题讨论】:
-
“不知道当前元素”是什么意思有点不清楚。我猜你可以访问列表,对吧?所以你可以阅读它吗?
-
如果它是手动排列的数组,我可以阅读它。但是,假设我正在从 API 获取结果。我不知道我收到了什么物品。排序必须在我(作为开发人员)不知道推送哪些项目的情况下完成。
-
但是您从 API 获取了一个数组,然后您可以毫无问题地读取该数组?您还可以从 API 中获得一个元素,您也可以毫无问题地阅读它吗?您的任务是创建一个新的排序数组,并在正确的位置插入该元素。我明白你的问题了吗?
-
@NordlingArt 仅供参考,当需要时,拼接函数无法将 el 插入数组的最后。应该返回 m 而不是 -m-1?
-
@NordlingArt 这个原型解决方案不起作用!使用一个简单的整数列表,我最终得到一个非常未排序的数组。仍在试图找出问题所在......
标签: javascript arrays