【问题标题】:How do I quicksort something based on its variable in local storage?如何根据本地存储中的变量快速排序?
【发布时间】:2016-01-31 06:02:57
【问题描述】:

您好,我正在尝试通过其 ID 对 localStorage 中的一些数据进行排序。

数据的格式是这样的: {"品牌":"讴歌","型号":"选择您的型号","年龄":"1998","KM":"10","姓名":"Harry","ContactInfo":"123456677" }

我想按 KM 值的从低到高的顺序排序。

我的本​​地存储密钥已注册,这是我正在使用的代码:

function Qsort() {
    var mymain = JSON.parse(localStorage.getItem("register"));
    var result = quicksort(mymain, 0, mymain.length - 1);
    // the following line fo code shows the final result of the sorted numbers or strings
    console.log(mymain);
    console.log(quicksort(mymain, 0, mymain.length - 1));
    return result;
}

function quicksort(mymain, left, right) {
    var index;

    // checks if there are more than one numbers
    if (mymain.length > 1) {

    // partition will find a pivot then split leist in two either left of right. 
    // Left list contains everything that is smaller than the pivot and the right contians everythign larger than pivot
    index = partition(mymain, left, right);

    // will treat left side aas a new problem and will then run the sort
    if (left < index - 1){
        quicksort(mymain, left, index - 1)
    }

    // will treat right side as a new problem and will then run the sort
    if (index < right) {
        quicksort(mymain, index, right)
        }

    }
    return mymain
}

// Divides the whole function
function partition(mymain, left, right) {
    var pivot = mymain[Math.floor((right + left) / 2)],
        i     = left,
        j     = right;

    while (i <= j) {
        while (mymain[i] < pivot) {
            i++;
        }
        while (mymain[j] > pivot) {
            j--;
        }
        if (i <= j) {
            swap(mymain, i, j);
            i++;
            j--;
        }
    }
    return i;
}

// swaps the values based on how high or low the number is
function swap(mymain, firstIndex, secondIndex) {
    var temp = mymain[firstIndex];
    mymain[firstIndex] = mymain[secondIndex];
    mymain[secondIndex] = temp;
}

我应该如何处理var mymain 部分,以便它只获取 KM 下定义的值。

【问题讨论】:

  • 除非它的集合太大......你真的可能想尝试类似:function order(x, key) { return x.sort(function(a,b) { return a[key] - b[key] }) }

标签: javascript local-storage quicksort


【解决方案1】:

假设localStorage"register" 的项目是一个数组,您可以简单地执行...

var mymain = JSON.parse(localStorage.getItem("register"))
var justKMs = mymain.map(function(data){ return data.KM; });

但这将返回一个仅包含 KM 值的数组,因此您最终将不得不搜索 mymain 列表以获取其余数据,我认为这不是您想要的。

另一种方法是添加一个“查找”函数来告诉快速排序“如何”获取要用于排序的值。让我们将查找函数签名简单地定义为function lookup( item ) =&gt; value,其中item 是列表中当前正在排序的事物,value 是排序依据的值。

以下是来自computer-science-in-javascript 的快速排序版本,添加了“查找”功能。

// the swap function doesn't need to change
function swap(items, firstIndex, secondIndex) {
    var temp = items[firstIndex];
    items[firstIndex] = items[secondIndex];
    items[secondIndex] = temp;
}

// you will need to pass the lookup function into partition
function partition(items, left, right, lookup) {
    // here you need to use "lookup" to get the proper pivot value
    var pivot = lookup(items[Math.floor((right + left) / 2)]),
        i = left,
        j = right;

    while (i <= j) {
        // here is where you will do a lookup instead of just "items[i]"
        while (lookup(items[i]) < pivot) {
            i++;
        }
        // also use lookup here
        while (lookup(items[j]) > pivot) {
            j--;
        }

        if (i <= j) {
            swap(items, i, j);
            i++;
            j--;
        }
    }

    return i;
}

function quickSort(items, left, right, lookup) {
    var index;

    // performance - don't sort an array with zero or one items
    if (items.length > 1) {
        // fix left and right values - might not be provided
        left = typeof left != "number" ? 0 : left;
        right = typeof right != "number" ? items.length - 1 : right;

        // set a default lookup function just in case
        if (typeof lookup !== 'function') {
            // the default lookup function just returns the item passed in
            lookup = function (item) {
                return item;
            };
        }

        index = partition(items, left, right, lookup);

        if (left < index - 1) {
            quickSort(items, left, index - 1, lookup);
        }

        if (index < right) {
            quickSort(items, index, right, lookup);
        }
    }
    return items;
}

然后您的数据集的“查找”功能将是...

function kmLookup( data ) {
    return data.KM;
}

...啊,高阶函数的威力

作为旁注,如果你不是真的嫁给快速排序,你可以选择懒人选项(或智能选项,取决于你的观点)并在数组原型上使用sort 方法...

var mymain = JSON.parse(localStorage.getItem("register"));

// the sort function sorts the array in place,
//  so after this next line mymain will be sorted
mymain.sort(function (a, b) {
    return a.KM - b.KM;
});

假设您使用的不是非常大的数据集,这可能是最好的解决方案。 MDN Array.prototype.sort() docs

【讨论】:

  • 这可能是一个愚蠢的问题,但是在您写入数据的部分,我是否必须定义我的 localStorage 密钥是什么,或者我只是将其保留为数据?
  • 你指的是什么时候?如果您在谈论第一个代码块mymain.map(function(data){ return data.KM; })data 是传递给Array.prototype.map 的回调函数的参数,它表示一个具有{ "Brand":"Acura", "Model":"TLX", "Age":"1998", "KM":"10", "Name":"Harry", "ContactInfo":"123456677" } 结构的对象。我假设localStorage.getItem("register") 返回的 JSON 计算结果为 [ data, data ... ],其中数据如您所述。
  • 哦,有道理对不起我是 javascript 新手,我不知道所有的东西,比如数据参数等等。
  • 如果这解决了你的问题@JishnuKher,我很想得到另一个“公认的答案”!
猜你喜欢
  • 2013-12-16
  • 2023-03-12
  • 1970-01-01
  • 2015-05-28
  • 2015-02-27
  • 2017-09-04
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多