2017-08-27 3 views
2

jsonレスポンスに基づいて新しいオブジェクトを作成しようとしています。ランクでオブジェクトの新しい配列を作成します。

は、私がこのような何かに彼らの差分によって、各1をランク付けしながら、どのように私は、オブジェクトの新しい配列を作成することができ

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

のJSONレスポンスを持っていると言いますか?

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

ただ、あなただけ減算することによって、それをsliceで配列のコピーを作成し、sortできるロジックは

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 }) 
}); 
+1

diff = 0.1> 0.7ただし0.7> 0.09 – marvel308

+0

woopsです。それを修正しました – totalnoob

+0

@totalnoob:下の解決策のいずれかがあなたのために働いた場合、upvote/questionへの回答をリクエストしてください。ありがとう! – 82Tuskers

答えて

1

は、私はそれを行うだろう方法は次のとおりです。

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

これはあまりにも負の数のために動作します。

+0

これは他の答えよりもエレガントです。 diffのためにnullを持つオブジェクトを削除するにはどうすればよいですか? – totalnoob

+0

私は 'diff'の' null'を持つオブジェクトをすべて削除する方法を示す私の答えを更新しました。 –

+0

順序を逆にする必要があります。これを答えとして選択します。 0.1> 0.7> 0.09> null – totalnoob

1

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);

+0

あなたは 'parseInt'を使いたくありません。代わりに 'parseFloat'を試してください。 –

+0

@AaditMShah yeah correct – Sajeetharan

+1

OPが「新しいオブジェクトの配列」を求めているので、私はあなたの答えを編集しました。 –

2

をどのように動作するかのアイデアを必要とします差分を返して、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;}

+1

あなたの出力は0.09> 0.1です – marvel308

1

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); 

はそれが動作するかどうか私に教えてください。ここで

+0

ランクはどうですか? –

+0

おっと!質問のランクに逃した。修正しました。 – 82Tuskers

+0

また、OPがオブジェクトの新しい配列を必要としていないことも忘れていました。したがって、配列をソートする前に配列をスライスする必要があります。 –

関連する問題