2017-03-03 5 views
0

JSONデータがあり、同じタイプのobj値から最後のobj値が必要です。jsonで同じタイプの最後のobj値を取得する

私はしたいFoo値の最後のインデックスを取得するBar

私はjson配列の最後のインデックスを取得する方法を知っています。

var data = [{ 
 
    "foo": "bar" 
 
    }, 
 
    { 
 
    "foo": "bar-1" 
 
    }, 
 
    { 
 
    "foo": "bar-2" 
 
    }, 
 
    { 
 
    "foo": "bar-1" 
 
    }, 
 
    { 
 
    "foo": "bar" 
 
    }, 
 
    { 
 
    "foo": "bar-1" 
 
    }, 
 

 
] 
 

 

 

 
$.each(data, function(key, val) { 
 
    if (val.foo == "bar") { 
 
    console.log(key); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

ない偉大な重複 – mplungjan

+0

@mplungjanその後、おそらく、代わりに質問に答えるのは、重複を見つけることができます。 1つがあるので。 –

+0

@MikeMcCaughan - 答えを書くのに時間がかかりました:) – mplungjan

答えて

2

のjQuery、逆にちょうどループの必要はありません:

したい要素が終わり近くにあると仮定。そうでない場合には、与えられた削減やマップの回答のいずれかの可能性が高い

var data = [ 
 
    {"foo": "bar"}, 
 
    {"foo": "bar-1"}, 
 
    {"foo": "bar-2"}, 
 
    {"foo": "bar-1"}, 
 
    {"foo": "bar"}, 
 
    {"foo": "bar-1"} // no comma on the last 
 
] 
 

 

 
// Find the last `bar` 
 

 
for (var i=data.length-1;i>=0;i--) { 
 
    if (data[i].foo == "bar") { 
 
    console.log('Last of Foo Bar is ' +i); 
 
    break; 
 
    } 
 
} 
 

 
// Find the last `bar` AND the last bar-1 
 
var bars = { "bar":-1, "bar-1":-1, "done":0 }, numBars = 2; 
 
for (var i=data.length-1;bars["done"]<numBars && i>=0;i--) { 
 
    if (bars[data[i].foo]==-1) { 
 
    bars[data[i].foo] = i; 
 
    bars["done"]++; 
 
    } 
 
} 
 
console.log(JSON.stringify(bars));

+0

しかし、私はさらなる仕事をする必要があるので、私はそれぞれのループをjqueryする必要があります。ソリューションのためにbtwありがとうございます:) –

+1

'$ .each'を使うことは何の違いもありません - オブジェクトの配列をループしています。 jQueryは無関係で、この場合、より冗長です。 –

+1

これは最も効率的な答えです、私は騒音を減らすために鉱山を取り除きました。あまりにも私から考え過ぎる。 :) –

1

はるかに遅いではありません実際には、あなたはそれを解決するためにjQueryを使用する必要はありません。

var data = [{foo:"bar"},{foo:"bar-1"},{foo:"bar-2"},{foo:"bar-1"},{foo:"bar"},{foo:"bar-1"}], 
 
    indexes = []; 
 
    data.forEach((v,i) => v.foo == 'bar' ? indexes.push(i) : v); 
 

 
console.log(`Index of last 'bar' key is ${indexes[indexes.length-1]}`);

+0

もう一度繰り返すだけです。 – mplungjan

+0

@mplungjan *もっと長い*。ああ、してください。 –

+0

もちろん、OPの例の配列では問題はありませんが、実際の配列の大きさを知る方法はありません。この例が現実と一致するとは決して考えないでください。あなたは押したものの最後を見つけるために何千ものアイテムを作成することができます。 – mplungjan

2

あなただけ使用することができreduce()と要素は、その要素のインデックスに設定されたアキュムレータ値を発見されたとき。最後に見つかった要素のインデックスが返されます。

var data = [{"foo":"bar"},{"foo":"bar-1"},{"foo":"bar-2"},{"foo":"bar-1"},{"foo":"bar"},{"foo":"bar-1"}] 
 

 
var lastIndex = data.reduce(function(r, e, i) { 
 
    if(e.foo == 'bar') r = i 
 
    return r; 
 
}, null) 
 

 
console.log(lastIndex)

+0

これはちょうどリバースループよりも時間がかかります – mplungjan

+0

@mplungjanはい、この特定のタスクではあなたのソリューションはより効率的ですが、何らかの理由ですべての要素をループする必要があります。 –

+0

彼は何らかの理由でjQueryが必要だと言います。私は彼が何をしたいのかほかに知りたいです – mplungjan

関連する問題