辞書の特定のvalueを範囲指定しソートし新しいもの順に並び替えたい
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 349
var start ="2012-01-14 10:30:00";
var end ="2015-06-26 10:00:00";
という2つの変数があり、このstart変数~end変数までの間で
df辞書の2番目の要素を絞りたい。
{'A':[{'a1':10,'a2':'2009-04-26 10:14,49'},{'a1':10,'a2':'2015-12-16 17:32:40'}],'B':[{'a1':40,'a2':'2010-06-01 04:38:49'},{'a1':30,'a2':'2011-08-23 17:17:24'},{'a1':30,'a2':'2014-03-25 09:39:59'},'C':[{'a1':30,'a2':'2014-11-21 04:16:37']}
というdf変数がある。
df={'A':[{'a1':10,'a2':'2009-04-26 10:14:49'},{'a1':10,'a2':'2015-12-16 17:32:40'}],'B':[{'a1':40,'a2':'2010-06-01 04:38:49'},{'a1':30,'a2':'2011-08-23 17:17:24'},{'a1':30,'a2':'2014-03-25 09:39:59'},'C':[{'a1':30,'a2':'2014-11-21 04:16:37']}
var start ="2012-01-14 10:30:00";
var end ="2015-06-26 10:00:00";
var result=JSON.parse(JSON.stringify(df)).filter(function(x){
return x[2]>=start && x[2]<=end;
}).sort(function(x,y){
return x[2]==y[2]?0:(x[2]<y[2]?1:-1);
});
と前回の質問https://teratail.com/questions/127327 と同じようにコードを書いたがdfが辞書のためうまくいかなかった。
理想のアウトプットは、result変数に
{'B':[{'a1':30,'a2':'2014-03-25 09:39:59'}],'C':[{'a1':30,'a2':'2014-11-21 04:16:37']}
と格納されることである。
辞書の時はどのように直せばいいのか?何が間違っているのか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
こうですね
var df={
'A':[
{'a1':10,'a2':'2009-04-26 10:14,49'},
{'a1':10,'a2':'2015-12-16 17:32:40'},
],
'B':[
{'a1':40,'a2':'2010-06-01 04:38:49'},
{'a1':30,'a2':'2011-08-23 17:17:24'},
{'a1':30,'a2':'2014-03-25 09:39:59'},
],
'C':[
{'a1':30,'a2':'2014-11-21 04:16:37'},
],
};
var start ="2012-01-14 10:30:00";
var end ="2015-06-26 10:00:00";
var new_df={};
Object.keys(df).forEach(function(x){
var y=df[x].filter(function(x){
return x["a2"]>=start && x["a2"]<=end;
}).sort(function(x,y){
return x["a2"]==y["a2"]?0:(x["a2"]<y["a2"]?1:-1);
});
if(y.length>0) new_df[x]=y;
});
console.log(new_df);
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
df={'A':[{'a1':10,'a2':'2009-04-26 10:14:49'},{'a1':10,'a2':'2015-12-16 17:32:40'}],'B':[{'a1':40,'a2':'2010-06-01 04:38:49'},{'a1':30,'a2':'2011-08-23 17:17:24'},{'a1':30,'a2':'2014-03-25 09:39:59'},'C':[{'a1':30,'a2':'2014-11-21 04:16:37']}
↑そもそも、こいつの配列閉じ括弧が適正に入っていないので、まずここを直さないと動きません。
let func1 = () => {
let df={
'A':[{'a1':10,'a2':'2009-04-26 10:14:49'},
{'a1':10,'a2':'2015-12-16 17:32:40'}],
'B':[{'a1':40,'a2':'2010-06-01 04:38:49'},
{'a1':30,'a2':'2011-08-23 17:17:24'},
{'a1':30,'a2':'2014-03-25 09:39:59'}],
'C':[{'a1':30,'a2':'2014-11-21 04:16:37'}]
};
let start ="2012-01-14 10:30:00";
let end ="2015-06-26 10:00:00";
let result = {};
for(key in df){ // ここは連想配列のキー値でループ
let arr = df[key].filter((obj1)=>{
// ここでは連想配列の要素である配列をフィルタリング
let val = obj1['a2'];
return (start < val && val < end);
});
// 取得結果が0件なら処理をスキップ
if(arr.length == 0){ continue; }
result[key] = arr;
};
return result;
};
func1();
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.99%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
HayatoKamono
2018/05/22 16:41 編集
「df辞書の2番目の要素を絞りたい。」とありますが、対象のデータ構造は配列ではないので、何番目という概念がそもそもないと思います。また、JavaScriptではobjectの列挙順は保証もされていません。例えば、console.log(Object.keys({ "A": 'aaa', "1": '111' }))と実行すると、Aよりも1の方が先に出力されます。というか、「2番めの要素」というのはBを表しているのではないのですか?理想のアウトプットをみると、BとCの2つがありますが。ここでの「2番目」とは何が基準となっているものなのでしょうか?
k0908
2018/05/22 16:50
2番目の要素とは、'a2':'2009-04-26 10:14,49'・'a2':'2015-12-16 17:32:40'・'a2':'2010-06-01 04:38:49'・・・などのa2の要素を表しています
k0908
2018/05/22 16:50
辞書には何番目という要素がないのですね!知らなかった・・・
HayatoKamono
2018/05/22 17:01 編集
「2番目の要素とは、・・・などのa2の要素」←理想のアウトプットをみると、a1も含まれているようですが?それと、a2なりdateなり対象のkey名が決まっているのであれば、質問文内の表記を「2番めの要素」というよりは、「a2」なり「任意のkey名」なりに置き換えた方が良いかと思います。「辞書には何番目という要素がないのですね!」← Objectにはないですが、Mapにはあります。
k0908
2018/05/22 17:07
a2で該当する配列にソートをかけて、そのa2が含まれる辞書とその親の辞書のkeyを含む辞書を返したいという意図です