使用jQuery或javascript按对象键顺序对数组进行排序

时间:2018-01-28 12:41:08

标签: javascript jquery arrays sorting object

const path = require('path')
const fs = require('fs')

let file = '/opt/bin/file1'
let size
fs.stat(file, (err, stats) => { size = stats.size })
let paths = file.split(path.sep)

let nameChild = file
let objChild = { "name" : nameChild, "value" : size }
let nameParent
let objParent

for (var i in paths) {

    if (i==0) continue

    nameParent = path.dirname(nameChild)

    objParent = { "name" : nameParent, "value" : size, "children" : [ objChild ] }

    nameChild = nameParent
    objChild = objParent

}

console.log(JSON.stringify(objParent))

返回:var ops = { '1':'Label 1', '2':'Label 2', '3':'Label 3', }; var selected = ['3','1']; var labels = selected.map(function(index) { return ops[index]; }); console.log(labels);

我想按照它们在带有字符串键的(2) ["Label 3", "Label 1"]对象中出现的顺序返回标签。我希望能够简洁地完成它,最好是链接到ops函数,或者甚至在同一个map函数内,如果可能的话。

我找到了几种方法可以将map按另一个array排序,但没有快速按array键排序array

通过一切可能的方式,我想避免使用object功能。

4 个答案:

答案 0 :(得分:1)

使用项目数组并根据所选数组过滤该数组,然后将过滤后的数组映射到标签。

由于您使用有序数组,因此无需其他排序



var ops = 
[
    {value:'3',label:'Label 3'},
    {value:'1',label:'Label 1'},
    {value:'2',label:'Label 2'},
];
var selected = ['1','3'];

var labels = ops.filter(function(item){
   return selected.indexOf(item.value)>-1;
}).map(function(item){
   return item.label;
});

console.log(labels);




答案 1 :(得分:0)

使用sort函数及其predicate或比较函数。

var ops = 
{
    '3':'Label 3',
    '1':'Label 1',
    '2':'Label 2',
    
};
var opsMap = ['3', '1', '2'];
var selected = ['3','1'];
var labels = selected.sort(function(a, b){
  
  if (opsMap.indexOf(a) < opsMap.indexOf(b)){
    return -1;
    
  }
  
  if (opsMap .indexOf(a) > opsMap .indexOf(b))
    return 1;
  
  return 0;
}).map(function(index)
{
    return ops[index];
});    
console.log(labels);

进一步了解JavaScript处理对象属性的方式。我发现添加属性的顺序无关紧要。 JavaScript或其引擎(无论是V8,Chakra还是其他任何东西)都会以某种方式订购这些属性。你可以在这里进一步了解它: http://2ality.com/2015/10/property-traversal-order-es6.html https://hackernoon.com/out-of-order-keys-in-es6-objects-d5cede7dc92e

但您可以通过提供包含对象的地图来使用解决方法,例如:let map = ['3', '1', '2']。然后,可以稍后使用该映射以使用上述方法或其他方式以正确的顺序获得元素。

有关Map() ES6功能的更多信息以及如何在旧版浏览器中实现它。

http://www.jstips.co/en/javascript/map-to-the-rescue-adding-order-to-object-properties/

答案 2 :(得分:-1)

正如@charlietfl所说:对象内部没有订单。但是您可以创建一个包含所有键的数组并对此数组进行排序。然后循环遍历此数组并按顺序获取值。

$results = $xpath->query('//div[contains(@class, "div_common_class")]');
foreach ($results as $result) {
    echo sprintf("<b>%s %s</b><br>",
        $result->getElementsByTagName("div")->item(1)->textContent,
        $result->getElementsByTagName("input")->item(0)->getAttribute("value"));
}

答案 3 :(得分:-1)

在进行计算之前如何对select函数进行排序?

selected = selected.sort((a,b) => ops[a].localeCompare(ops[b]));