2016-09-24 37 views
1

我的数组对象如下JavaScript的数组对象排序工作不正常

var data = [{"weight":0,"name":"New Arrivals"},{"weight":0,"name":"Weekly Promotions"},{"weight":0,"name":"Sale"},{"weight":0,"name":"Extended Size"},{"weight":0,"name":"Accessories and Shoes"},{"weight":0,"name":"Activewear"},{"weight":0,"name":"Disney Project"},{"weight":0,"name":"Dresses and Jumpsuits"},{"weight":0,"name":"Fleece"},{"weight":0,"name":"HEATTECH Collection"},{"weight":0,"name":"Ines de la Fressange"},{"weight":0,"name":"Intimates"},{"weight":0,"name":"Jeans"},{"weight":0,"name":"Loungewear"},{"weight":0,"name":"Outerwear and Blazers"},{"weight":0,"name":"Pants"},{"weight":0,"name":"Shirts and Blouses"},{"weight":0,"name":"Skirts"},{"weight":0,"name":"Socks and Hosiery"},{"weight":0,"name":"Sweaters"},{"weight":0,"name":"Sweatshirts and Sweatpants"},{"weight":0,"name":"T-Shirts and Tops"},{"weight":0,"name":"UT: Graphic Tees"},{"weight":0,"name":"Wear To Work"},{"weight":0,"name":"Mix and Match"}] 

正尝试根据性质权重排序这一点,但在情况下,如果重量的所有值是0,我需要的原因为它在输出上。但是这个功能并没有像预期的那样工作,而是顺序在变化。

曾用ramda以及JavaScript的排序

var sortedData = R.sortBy(R.prop('weight'), data); 

var sortData = data.slice(0); 
sortData.sort(function(a,b) { 
    return a.weight - b.weight; 
}); 

两种情况下我得到的结果如下

var output = [{"weight":0,"name":"Jeans"},{"weight":0,"name":"New Arrivals"},{"weight":0,"name":"Sale"},{"weight":0,"name":"Extended Size"},{"weight":0,"name":"Accessories and Shoes"},{"weight":0,"name":"Activewear"},{"weight":0,"name":"Disney Project"},{"weight":0,"name":"Dresses and Jumpsuits"},{"weight":0,"name":"Fleece"},{"weight":0,"name":"HEATTECH Collection"},{"weight":0,"name":"Ines de la Fressange"},{"weight":0,"name":"Intimates"},{"weight":0,"name":"Weekly Promotions"},{"weight":0,"name":"Loungewear"},{"weight":0,"name":"Outerwear and Blazers"},{"weight":0,"name":"Pants"},{"weight":0,"name":"Shirts and Blouses"},{"weight":0,"name":"Skirts"},{"weight":0,"name":"Socks and Hosiery"},{"weight":0,"name":"Sweaters"},{"weight":0,"name":"Sweatshirts and Sweatpants"},{"weight":0,"name":"T-Shirts and Tops"},{"weight":0,"name":"UT: Graphic Tees"},{"weight":0,"name":"Wear To Work"},{"weight":0,"name":"Mix and Match"}] 

预期:当体重值是0所有的情况下,那么我期待的结果与输入一样。

任何帮助表示赞赏。

回答

1

最简单的解决方法是保存的位置,然后进行比较,如果对象是相等的:

var sortData = data.slice(0); 

sortData.forEach(function(element, index){ 
    element.index = index; 
}); 

sortData.sort(function(a,b) { 
    var diff = a.weight - b.weight; 
    return diff === 0 ? a.index - b.index : diff; 
}); 

sortData.forEach(function(element){ 
    delete element.index; 
}); 
1

你所寻找的是叫stability排序算法的性能。这意味着排序后,等值元素的顺序保持不变。不同的浏览器使用不同的算法进行排序,其中一些浏览器使用稳定的算法,一些使用不稳定的算法。你可以看到这个SO线程上的浏览器之间的区别:https://stackoverflow.com/a/3027715/1641070

正如你可以在Ramda来源看,它使用内置的排序机制,让您得到相同的结果,如果你使用Ramda:https://github.com/ramda/ramda/blob/v0.22.1/src/sortBy.js#L38:L42

1

一个建议与Sorting with map。在这里,您有索引,并使用第二个链接的排序标准保留原始排序。

mapped.sort(function (a, b) { 
    return a.value - b.value || a.index - b.index; 
}); 

// the array to be sorted 
 
var data = [{ weight: 0, name: "New Arrivals" }, { weight: 0, name: "Weekly Promotions" }, { weight: 0, name: "Sale" }, { weight: 0, name: "Extended Size" }, { weight: 0, name: "Accessories and Shoes" }, { weight: 0, name: "Activewear" }, { weight: 0, name: "Disney Project" }, { weight: 0, name: "Dresses and Jumpsuits" }, { weight: 0, name: "Fleece" }, { weight: 0, name: "HEATTECH Collection" }, { weight: 0, name: "Ines de la Fressange" }, { weight: 0, name: "Intimates" }, { weight: 0, name: "Jeans" }, { weight: 0, name: "Loungewear" }, { weight: 0, name: "Outerwear and Blazers" }, { weight: 0, name: "Pants" }, { weight: 0, name: "Shirts and Blouses" }, { weight: 0, name: "Skirts" }, { weight: 0, name: "Socks and Hosiery" }, { weight: 0, name: "Sweaters" }, { weight: 0, name: "Sweatshirts and Sweatpants" }, { weight: 0, name: "T-Shirts and Tops" }, { weight: 0, name: "UT: Graphic Tees" }, { weight: 0, name: "Wear To Work" }, { weight: 0, name: "Mix and Match" }]; 
 

 
// temporary array holds objects with position and sort-value 
 
var mapped = data.map(function (el, i) { 
 
     return { 
 
      index: i, 
 
      value: el.weight 
 
     }; 
 
    }); 
 

 
// sorting the mapped array containing the reduced values 
 
mapped.sort(function (a, b) { 
 
    return a.value - b.value || a.index - b.index; 
 
}); 
 

 
// container for the resulting order 
 
var result = mapped.map(function (el) { 
 
    return data[el.index]; 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0

您可以使用下划线的_.sortBy稳定排序(数据, '重量')。 check this