优化从另一个阵列对一个阵列的排序

时间:2018-10-01 16:58:31

标签: javascript arrays sorting optimization

我有两个数组,一个包含一些项目,另一个包含这些项目的 sorted id,例如:

const sortedItems = [
    { id: 4, label: 'ipsum' },
    { id: 3, label: 'lorem' },
    { id: 2, label: 'bar' },
    { id: 1, label: 'foo' },
]

我想拥有另一个数组,其中包含按其ID排序的项目,如下所示:

asc

请注意,顺序不一定是desclet sortedItems = [] sortedItemIds.map((itemId, index) => { items.map(item) => { if (item.id === itemId) { sortedItems[index] = item } } })

我编写了这段代码,工作得很好

Array.map()

由于嵌套的<script> (function(i, s, o, g, r, a, m) { i["GoogleAnalyticsObject"] = r; i[r] = i[r] || function() { (i[r].q = i[r].q || []).push(arguments) }, i[r].l = 1 * new Date(); a = s.createElement(o), m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m) })(window, document, "script", "//www.google-analytics.com/analytics.js", "ga"); ga("create", "UA-52143532-4", "auto"); ga("require", "ec"); ga("ec:addProduct", { "id": "pay-q39-instead-of-q90-fo", "name": "Pay Q39 instead of Q90 for haircut (2018-09-17)", "category": "Other", "brand": "The Barber's Shop", "variant": "male", "price": "5.07" }); // Transaction level information is provided via an actionFieldObject. ga("ec:setAction", "detail"); ga("send", "event", "ecommerce", "detail"); </script> 函数,我觉得我可能会遇到大量项目的问题

在这种情况下,是否有更好的方法/最佳实践?

2 个答案:

答案 0 :(得分:3)

您可以创建一个键为id的对象,然后使用该对象通过id获取值。

const items = [{ id: 1, label: 'foo' },{ id: 2, label: 'bar' },{ id: 3, label: 'lorem' },{ id: 4, label: 'ipsum' }]
const sortedItemIds = [4, 3, 2, 1]

const obj = {}
items.forEach(o => obj[o.id] = o);

const sortedItems = sortedItemIds.map(e => Object.assign({}, obj[e]));
console.log(sortedItems)

答案 1 :(得分:1)

执行此操作不需要功能映射,只需使用查找Array.indexOfArray.sort对其进行排序即可。

const items = [{ id: 1, label: 'foo' },{ id: 2, label: 'bar' },{ id: 3, label: 'lorem' },{ id: 4, label: 'ipsum' }],
      sortedItemIds = [4, 3, 2, 1];

items.sort((a, b) => sortedItemIds.indexOf(a.id) - sortedItemIds.indexOf(b.id));
console.log(items);
.as-console-wrapper { max-height: 100% !important; top: 0; }