如何按编号对JS中的嵌套数组进行排序?

时间:2017-11-22 06:27:59

标签: javascript arrays sorting nested

我想按工资开头用嵌套数组排序 获得最高工资的人 以收到最低者的人结束 一。我t want to take into consideration the currency... I don知道怎么做... 提前致谢

Array
(
[0]=>Array
(
[firstName]=>John
[lastName]=>Doe
[age]=>35
[salary]=>Array
(
[gbp]=>"180"
[eur]=>“”
[usd]=>""
)
)
[1]=>Array
(
[firstName]=>Maria
[lastName]=>Anders
[age]=>26
[salary]=>Array
(
[gbp]=>""
[eur]=>"100"
[usd]=>""
)
)
[2]=>Array
(
[firstName]=>Thomas
[lastName]=>Hardy
[age]=>31
[salary]=>Array
(
[gbp]=>""
[eur]=>""
[usd]=>"224"
)
)
)

3 个答案:

答案 0 :(得分:1)

看起来你发布了php。

无论如何,请看一下sort函数:

var numbers = [{
  age: 10,
  salary: {
    gbp: 10,
    eur: 0,
    usd: 0
  }
}, {
  age: 2,
  salary: {
    gbp: 0,
    eur: 345,
    usd: 0
  }
}, {
  age: 100,
  salary: {
    gbp: 0,
    eur: 0,
    usd: 23
  }
}, {
  age: 50,
  salary: {
    gbp: 0,
    eur: 432,
    usd: 0
  }
}];

numbers.sort(function(a, b) {
  // Get the sum of salaries in the a object
  let aAmt = Object.values(a.salary).reduce((s, v) => s + v, 0)
  // Get the sum of salaries in the b object
  let bAmt = Object.values(b.salary).reduce((s, v) => s + v, 0)
  // Calculate the difference
  return bAmt - aAmt
})

console.log(numbers);

答案 1 :(得分:1)

我不认为你发布的是JS,但如果你在JS中有类似的数组类型,你可以尝试使用以下

假设数组看起来像这样

var x = [['John', 'Doe', 35, [180,0,0]],['Maria','Anders',26,[0,100,0]],['Thomas','Hardy',31,[0,0,224]]]

然后你可以使用这个

function sorty(a,b){
    if(Math.max.apply(null, a[3]) > Math.max.apply(null, b[3])) return -1;
    if(Math.max.apply(null, a[3]) < Math.max.apply(null, b[3])) return 1;
    return 0
}

然后运行:

x.sort(sorty)

会给你这个:

    0: (4) ["Thomas", "Hardy", 31, Array(3)]
    1: (4) ["John", "Doe", 35, Array(3)]
    2: (4) ["Maria", "Anders", 26, Array(3)]

我猜是一种黑客解决方案。

答案 2 :(得分:0)

虽然salary对象中只有一个相关值,但您可以使用logical OR ||从中获取值以进行排序。如果没有值truthy,则采用零。

Array#sort的回调中,取两个值的增量,a - ba之前对较小的b进行排序。如果您想对降序进行排序,只需将操作数反转为b - a

var array = [{ firstName: "John", lastName: "Doe", age: 35, salary: { gbp: "180", eur: "", usd: "" } }, { firstName: "Maria", lastName: "Anders", age: 26, salary: { gbp: "", eur: "100", usd: "" } }, { firstName: "Thomas", lastName: "Hardy", age: 31, salary: { gbp: "", eur: "", usd: "224" } }];

array.sort(function (a, b) {
    var aa = a.salary.gbp || a.salary.eur || a.salary.usd || 0,
        bb = b.salary.gbp || b.salary.eur || b.salary.usd || 0;

    return bb - aa;
});

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