Пытаясь создать новый объект на основе ответа JSON.

Скажи, что я получил ответ JSON

[{
    "id": "something1", 
    "diff": "0.09"
},     
{
    "id": "something2", 
    "diff": "0.7"
},     
{
    "id": "something3", 
    "diff": "0.1"
}]

Как я могу создать новый массив объектов при ранжировании каждого из них по их разности что-то вроде этого?

[{
    "rank": 1,
    "id": "something2", 
    "diff": "0.7"
},     
{
    "rank": 2,
    "id": "something3", 
    "diff": "0.1"
},     
{
    "rank": 3,
    "id": "something1", 
    "diff": "0.09"
}] 

Просто нужно понять, как будет работать логика

var obj = [];
$.each(data, function(a) {
    // var rank = 0; 
    // logic - if/else based on diff     
    obj.push({"rank": rank, "id": this.id, "diff" : this.percent_change_1h })
}); 
2
totalnoob 27 Авг 2017 в 21:08

4 ответа

Лучший ответ

Вот как бы я это сделал:

const data = [{
    id: "something1",
    diff: "0.09"
}, {
    id: "something2",
    diff: "0.7"
}, {
    id: "something3",
    diff: "0.1"
}, {
    id: "something4",
    diff: null
}];

const result = data
    .filter(({diff}) => diff !== null) // remove all objects with null for diff
    .sort((x, y) => y.diff - x.diff) // sort the data in descending order
    .map((x, i) => Object.assign({rank: i + 1}, x)); // copy object with rank

console.log("result:", result);
console.log("data:", data); // unchanged

Это работает и с отрицательными числами.

1
Aadit M Shah 27 Авг 2017 в 21:00

Вы можете просто создать копию массива с помощью slice, а затем sort, вычтя diffs, и отобразить его обратно со свойством rank

var arr = [{
  "id": "something1",
  "diff": "0.09"
}, {
  "id": "something2",
  "diff": "0.7"
}, {
  "id": "something3",
  "diff": "0.1"
}];

var arr2 = arr.slice().sort((a,b) => b.diff - a.diff).map((x,i) => (x.rank=(i+1),x));

console.log(arr2);
.as-console-wrapper {max-height: 100%!important; top:0;}
2
adeneo 27 Авг 2017 в 18:24

Вы можете использовать:

var response = [{
        "id": "something1",
        "diff": "0.09"
    },
    {
        "id": "something2",
        "diff": "0.7"
    },
    {
        "id": "something3",
        "diff": "0.1"
    }
];

var sorted = JSON.parse(JSON.stringify(response));

sorted.sort(function(a, b) {
    return (Number(b.diff) - Number(a.diff)) > 0;
}).forEach(function(e, index) {
    e.rank = index + 1;
});

console.log(sorted);

Дай мне знать, если это работает.

1
tyskr 27 Авг 2017 в 19:23
var response = [{
    "id": "something1", 
    "diff": "0.09"
},     
{
    "id": "something2", 
    "diff": "0.7"
},     
{
    "id": "something3", 
    "diff": "0.1"
}]

var sorted = response.slice().sort(function(a, b) {    
    return (parseFloat(b.diff)) - (parseFloat(a.diff));
})
sorted.forEach(function(row, index) {
  row.rank = index +1;
});
console.log(sorted);
1
Aadit M Shah 27 Авг 2017 в 18:25