ජාවාස්ක්‍රිප්ට් වස්තු සමූහයක හැඳුනුම්පතෙන් වස්තුව සොයා ගන්න


1577

මට පෙළක් තිබේ:

myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}, etc.]

අරාවේ ව්‍යුහය වෙනස් කිරීමට මට නොහැකිය. මට හැඳුනුම්පතක් සම්මත කර ඇති අතර 45, 'bar'එම වස්තුව සඳහා අරාව තුළ ලබා ගැනීමට මට අවශ්‍යය .

මම මෙය ජාවාස්ක්‍රිප්ට් හි හෝ jQuery භාවිතා කරන්නේ කෙසේද?

Answers:


1248

find()ක්රමය භාවිතා කරන්න :

myArray.find(x => x.id === '45').foo;

MDN වෙතින් :

මෙම find()අරාව තෘප්තිමත් තුල පවතී සපයා පරීක්ෂණ කාර්යය නම් ක්රමය, අරාව ප්රථම අගය පැමිණේ. එසේ නොමැතිනම් undefinedආපසු ලබා දෙනු ලැබේ.


ඒ වෙනුවට ඔබට එහි දර්ශකය සොයා ගැනීමට අවශ්‍ය නම් , භාවිතා කරන්න findIndex():

myArray.findIndex(x => x.id === '45');

MDN වෙතින් :

මෙම findIndex()ක්‍රමය මඟින් අරාවෙහි පළමු මූලද්‍රව්‍යයේ දර්ශකය ලබා දී ඇති පරීක්ෂණ ශ්‍රිතය තෘප්තිමත් කරයි. එසේ නොමැතිනම් -1 ආපසු ලබා දෙනු ලැබේ.


ඔබට ගැලපෙන අංග රාශියක් ලබා ගැනීමට අවශ්‍ය නම්, filter()ඒ වෙනුවට ක්‍රමය භාවිතා කරන්න:

myArray.filter(x => x.id === '45');

මෙය වස්තු සමූහයක් නැවත ලබා දෙනු ඇත. ඔබට fooගුණාංග රාශියක් ලබා ගැනීමට අවශ්‍ය නම් , ඔබට මෙය map()ක්‍රමවේදය සමඟ කළ හැකිය :

myArray.filter(x => x.id === '45').map(x => x.foo);

පැත්ත සටහන: වගේ ක්රම find()හෝ filter(), සහ කාර්යයන් arrow පැරණි බ්රව්සර (IE වැනි) මඟින් පහසුකම් සපයන්නේ නැත, ඒ නිසා ඔබ මේ වෙබ් බ්රව්සර සහාය කිරීමට අවශ්ය නම්, ඔබ භාවිතා කර ඔබගේ කේතය transpile යුතු බාබෙල් (සමග polyfill ).


2
බහුවිධ පරීක්ෂණ තත්වයන් සඳහා එය එසේ වනු ඇත: myArray.find (x => x.id === '45' && x.color == 'රතු'). Foo
Apqu

2
මට නම් මෙතෙක් හොඳම පිළිතුර. JQuery අවශ්‍ය නැත, නව සහායක අරා නිර්මාණය කිරීම අවශ්‍ය නොවේ.
කැන්ටා

myArray.find (x => x.id === '45') එය මැක් පරිගණකයේ ක්‍රියා නොකරයි
ගෝවින්ද රාජ්බාර්

JTJCrowder MDN වෙතින් පොලිෆිල්ස් ඔබේ කේතයට පිටපත් කිරීම හොඳ අදහසක් යැයි මම නොසිතමි; ඒ වෙනුවට, ඔබ පොලිෆිල්ස් සමඟ npm පැකේජ භාවිතා කළ යුතුය. බාබෙල්ට ES2015 + විශේෂාංග සඳහා පොලිෆිල්ස් ඇතුළත් වේ, බාබල් -පොලිෆිල් පැකේජයේ.
මයිකල් පෙරකොව්ස්කි

2
myArray.find (x => x.id === '45'). foo; '45 'හැඳුනුම්පතක් සහිත වස්තුවක් නොමැති නම් ව්‍යතිරේකය විසි කරයි.
ෆ්‍රේසර් කිර්ක්මන්

1469

ඔබ දැනටමත් jQuery භාවිතා කරන බැවින්, ඔබට අරාව සෙවීම සඳහා අදහස් කරන grep ශ්‍රිතය භාවිතා කළ හැකිය :

var result = $.grep(myArray, function(e){ return e.id == id; });

ප්‍රති result ලය වන්නේ සොයාගත් අයිතම සමඟ අරාවකි. වස්තුව සැමවිටම පවතින බවත් එය සිදුවන්නේ එක් වරක් පමණක් බවත් ඔබ දන්නේ නම්, ඔබට result[0].fooවටිනාකම ලබා ගැනීමට භාවිතා කළ හැකිය. එසේ නොමැතිනම් ඔබ එහි ප්‍රති ar ලයක් ලෙස ඇති අරාවේ දිග පරීක්ෂා කළ යුතුය. උදාහරණයක්:

if (result.length === 0) {
  // no result found
} else if (result.length === 1) {
  // property found, access the foo property using result[0].foo
} else {
  // multiple items found
}

124
ජාවාස්ක්‍රිප්ට් හි ක්‍රියාකරු සමඟ ඇති අමුතු ගැටළු මඟහරවා ගැනීම ===වෙනුවට භාවිතා කිරීම ආරක්ෂිත වේ. ====
විකී චිජ්වානි

11
Ick විකීචිජ්වානි: නූලක් නූලකට සංසන්දනය කිරීමේදී ගැටළු තිබේද?
ගුෆා

38
හොඳයි, ඔබ ඉන්නේ නම් පරම වග දෙකම e.idහා idකරනු නූල් විය, මම එය භාවිතා කිරීම කමක්නෑ සිතමු ==. එහෙත්, ඔබ වග බලා ගන්න ඔබ අකමැති නම්, ඔබ ප්රශ්න මුහුණ දීමට සිදු විය (සිට '' == 0ඇත trueනමුත් '' === 0වේ false). සඳහන් නොකිරීම=== වේගවත් බව පෙනේ ( stackoverflow.com/questions/359494/… ).
විකී චිජ්වානි

102
මූලික වශයෙන් මම සෑම විටම භාවිතා ===ඒක වැඩ නිසා හරියටම වැනි ==අනෙකුත් භාශා දී. ==ජාවාස්ක්‍රිප්ට් හි නොපවතින බව මම සලකමි .
විකී චිජ්වානි

6
@ද. අද්විතීය අගයන් සොයා බැලීමේදී මෙහි බොහෝ පිළිතුරු අපේක්ෂිත හැසිරීම සපයයි; ඔවුන් නැවත ඔවුන්ගේ ලූපයෙන් ආපසු පැමිණීම හෝ කැඩී යාම නිසා ඔබට ඒවා හඳුනාගත හැකිය (නැතහොත් නැවත ක්‍රියා කිරීම නැවැත්වීමට පහළ මට්ටමේ ඉදිකිරීම් වලට උපදෙස් දෙන්න). කැනොනිකල් නිදසුනක් සඳහා ජරෙඩ්පාර්ගේ පිළිතුර සහ එම තීක්ෂ්ණ බුද්ධිය සඳහා ආරොනියස්ගේ පිළිතුර බලන්න. පොදුවේ ගත් කල, මිනිසුන් මේ ආකාරයෙන් "පෙරණය" සහ "සොයා ගැනීම" ශ්‍රිත අතර වෙනස දක්වයි, නමුත් පාරිභාෂිතය වෙනස් වේ. වඩා කාර්යක්ෂම වුවද, මෙය තවමත් රේඛීය සෙවුමකි, එබැවින් ඔබට හැෂ් වගුවක් භාවිතා කිරීමට අවශ්‍ය නම්, ආරොන් ඩිගුල්ලාගේ පිළිතුර බලන්න (impl. විස්තර වලින් පරිස්සම් වන්න).
tne

363

තවත් විසඳුමක් වන්නේ බැලීමේ වස්තුවක් නිර්මාණය කිරීමයි:

var lookup = {};
for (var i = 0, len = array.length; i < len; i++) {
    lookup[array[i].id] = array[i];
}

... now you can use lookup[id]...

ඔබට බොහෝ සොයා බැලීම් කිරීමට අවශ්‍ය නම් මෙය විශේෂයෙන් සිත්ගන්නා සුළුය.

හැඳුනුම්පත් සහ වස්තු බෙදාගන්නා බැවින් මේ සඳහා වැඩි මතකයක් අවශ්‍ය නොවේ.


6
හරියටම මම සොයන දේ. විහිලු සහගත ලෙස මම එය අධික ලෙස අවුල් කිරීමට උත්සාහ කළ ආකාරය, එක් එක් අයිතමය ලැයිස්තුවෙන් ඉවත් කිරීම, කොච් ඩීබී වෙතින් ලැබුණු දත්ත විකෘති කොට මගේ ප්‍රයෝජනවත් ආකෘතියට එය ලබා ගැනීමට අවශ්‍ය වූ විට මා සොයාගත් පරිදි ලැයිස්තුවෙන් එක් එක් අයිතමය ඉවත් කිරීම. අවශ්‍යතා. +1 සර්!
slickplaid

5
මේක දක්ෂයි. එක් එක් භාවිතය සඳහා අරාව පුරා බැලීමෙන් අනෙක් අයට ඒත්තු ගියේ කෙසේදැයි මට සිතාගත නොහැකිය.
ඇලඩින් මෙහමෙඩ්

4
ඔබ දේපල අනුපිළිවෙල මත රඳා නොසිටින තාක් කල්: stackoverflow.com/questions/4886314/…
Marle1

විවේකයක් භාවිතා කරයි; සොයා ගැනීමට ඇත්තේ එක් වස්තුවක් පමණක් බව ඔබ දන්නේ නම්, පුඩුවේ හොඳ විකල්පයක් / වැඩිදියුණු කිරීමක් තිබේද?
irJvV

7
JirJvV: නැහැ, එය කිසිසේත්ම තේරුමක් නැහැ. ඔබට බොහෝ සෙවීම් කිරීමට අවශ්‍ය නම් ඉහත කේතය ප්‍රයෝජනවත් වේ. ඔබ එක් වරක් බැලුවහොත්, lookupවස්තුවක් නිර්මාණය කිරීම කාලය නාස්තියකි.
ආරොන් ඩිගුල්ලා

176

ECMAScript 2015 අරා වල සොයා ගැනීමේ () ක්‍රමය සපයයි :

var myArray = [
 {id:1, name:"bob"},
 {id:2, name:"dan"},
 {id:3, name:"barb"},
]

// grab the Array item which matchs the id "2"
var item = myArray.find(item => item.id === 2);

// print
console.log(item.name);

එය බාහිර පුස්තකාල නොමැතිව ක්‍රියා කරයි. නමුත් ඔබට පැරණි බ්‍රව්සර් සහාය අවශ්‍ය නම් ඔබට මෙම පොලිෆිල් ඇතුළත් කිරීමට අවශ්‍ය වනු ඇත .


1
බොහෝ විට එය තවමත් බොහෝ ඉතා පර්යේෂණාත්මක නොව බ්රව්සර එය සහාය පෙනේ ඇති developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
lejonl

2
මෙය සරල කළ හැකිය myArray.find(d=>d.id===45).foo;.
ෂැගී

1
Ha ෂැගී හෝ පවා myArray.find(({ id }) => id === 45).foo. නමුත් මෙය පැරණි පිළිතුරක් වන අතර එය ES2015 සින්ටැක්ස් වලට පෙර ලියන ලද්දකි. Oth ගොත්ඩෝගේ පිළිතුර දැනට නූල් වල වඩාත්ම යාවත්කාලීන ය.
රෙනාර් බර්ග්

1
Ha ෂැගී .find () නිශ්චිතව දක්වා නොමැති නම්, ඔබේ ප්‍රශස්තිකරණය දෝෂයක් ඇති කරයි. එබැවින් මෙම විසඳුම භාවිතා කළ හැක්කේ තරඟයක් සහතික කළ අවස්ථාවන්හිදී පමණි.
හර්බට් පීටර්ස්

1
Er හර්බට්පීටර්ස් ඔබට සැමවිටම ශුන්‍ය පරීක්‍ෂණයක් කළ හැකි බවට සහතික වීමට අවශ්‍ය නම්, එය විකල්ප දම්වැලකින් පහසු වනු ඇත : myArray.find(d => d.id === 45)?.foo.
රෙනාර් බර්ග්

141

Underscore.js ඒ සඳහා හොඳ ක්‍රමයක් ඇත:

myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'},etc.]
obj = _.find(myArray, function(obj) { return obj.id == '45' })

42
වාර්තාව සඳහා, ලො-ඩෑෂ් (එය බොහෝ විට අන්ඩර්ස්කෝර්ට වඩා ක්‍රියාකාරී වේ) සමාන ක්‍රමයක් ඇත. මෙහි ලිපි
user456584

ඔබ අපේක්‍ෂා කරන්නේ එක් වස්තුවක් පමණක් නම්, එක් ප්‍රති result ලයක් සොයා ගැනීමෙන් පසුව සොයා ගැනීම වඩාත් කාර්යක්ෂම වනු ඇත, සෙවීම තවදුරටත් ඉදිරියට නොයනු ඇත.
සදහටම

_Foreever _.find හි ලියකියවිලි වලින්: "ශ්‍රිතය පිළිගත හැකි මූලද්‍රව්‍යයක් සොයාගත් විගසම නැවත පැමිණෙන අතර සමස්ත ලැයිස්තුව හරහා ගමන් නොකරයි."
ගිජ්ජන් බී

129

මම හිතන්නේ පහසුම ක්‍රමය පහත දැක්වේ, නමුත් එය ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් 8 (හෝ ඊට පෙර) මත ක්‍රියා නොකරනු ඇත:

var result = myArray.filter(function(v) {
    return v.id === '45'; // Filter out the appropriate one
})[0].foo; // Get result and access the foo property

මට කුතුහලයක් ඇත, සුපුරුදු හා සසඳන විට මෙහි කාර්ය සාධන වාසියක් forතිබේද?
ඊගෝර් සීනොයෙව්

G ඊගෝර් සීනොවෙව්: ඔව්, නිසැකවම එම ES5 අරාව මෙවලම් සමඟ කාර්ය සාධන බලපෑම් ඇත. එක් එක් මූලද්‍රව්‍යය සඳහා වෙනම ශ්‍රිතයක් ක්‍රියාත්මක වන බැවින් සෘජු forලූපයකට සාපේක්ෂව එය සැබවින්ම වේගවත් නොවේ .
pimvdb

ඉතින් ඔබ කියන්නේ එය මන්දගාමී වනු ඇති බවයි? එසේම, එය සෑම විටම මට පෙනෙන පරිදි මුළු අරාවම පරිලෝකනය කරනු ඇත, නමුත් forපළමු තරගය තුළදී ලූපය අවසන් වේ.
ඊගෝර් සීනොවියෙව්

ඔබට IE8 සඳහා සහය අවශ්‍ය නම්, මෙය අතහරින්න: stackoverflow.com/questions/7153470/…
ඇඩම් ග්‍රාන්ට්

එහි කිසිදු අංගයක් නොමැති නම් මෙම කේතය දෝෂයක් ඇති කරයිid
ස්ටැන්

71

පහත සඳහන් දෑ උත්සාහ කරන්න

function findById(source, id) {
  for (var i = 0; i < source.length; i++) {
    if (source[i].id === id) {
      return source[i];
    }
  }
  throw "Couldn't find object with id: " + id;
}

17
මෙය ස්වකීය පිළිතුරට සුදුසු නොවේ, නමුත් නවීන බ්‍රව්සර් වල මෙම විසඳුම මෙසේ ලිවිය හැකිය: jsfiddle.net/rwaldron/j3vST
රික්

12
ඔබ කාර්යක්ෂමතාව සඳහා යන්නේ නම්, මෙම උදාහරණය පෙරණය () භාවිතා කිරීමට වඩා වේගවත් බව සලකන්න (රික්ගේ උදාහරණය බලන්න) මෙය පළමු ගැලපෙන අයිතමය සොයාගත් පසු නැවත පැමිණෙන අතර පෙරණය () සොයා ගැනීමෙන් පසුව පවා සම්පූර්ණ අරාව හරහා ක්‍රියාත්මක වේ. තරගය. එක් එක් අයිතමය සඳහා අතිරේක අරාවක් සෑදීම හෝ ශ්‍රිතයක් ඇමතීමේ පිරිවැය ද මෙයට නැත.
ආරොනියස්

3
Ick රික්, එම පිළිතුරේ වඩාත්ම සිත්ගන්නා කරුණ නම් ඔබට jsFiddle හි ප්‍රතිදාන කවුළුවට ෆයර්බග් කොන්සෝලය එක් කළ හැකි බවයි. ප්‍රතිදානය බැලීමට කොන්සෝලය විවෘත කරන ලෙස ලොග් වීම සහ වෙනත් කෙනෙකුට පැවසීමට වඩා මෙය වඩා හොඳය. නියමයි!
කයිල්මිට්

1
කිසිවෙකු එය මෙතෙක් සඳහන් කර නැති නිසා, AngularJS හි පෙරහන් ක්‍රමයක් ද ඇති බව මට එක් කිරීමට අවශ්‍ය විය .
ඉනෝ



31

ඉහත FindById ශ්‍රිතයේ සාමාන්‍ය හා වඩා නම්‍යශීලී අනුවාදයක්:

// array = [{key:value},{key:value}]
function objectFindByKey(array, key, value) {
    for (var i = 0; i < array.length; i++) {
        if (array[i][key] === value) {
            return array[i];
        }
    }
    return null;
}

var array = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
var result_obj = objectFindByKey(array, 'id', '45');

15

සිතියම් () ශ්‍රිතය භාවිතයෙන් ඔබට මෙය පහසුවෙන් ලබා ගත හැකිය :

myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];

var found = $.map(myArray, function(val) {
    return val.id == 45 ? val.foo : null;
});

//found[0] == "bar";

වැඩ කරන උදාහරණය: http://jsfiddle.net/hunter/Pxaua/


1
JQuery mapස්වයංක්‍රීයව nullමූලද්‍රව්‍ය ඉවත් කරන බව මට අමතක විය . එහි ප්‍රති mapresult ලය මුල් එකතුවෙහි දිගට සමාන නොවන බැවින් එය මට සහ පොදු සංකල්පයට නොමඟ යවන සුළුය .
මැක්ස්ආර්ට්

14

ඔබට පෙරහන් භාවිතා කළ හැකිය,

  function getById(id, myArray) {
    return myArray.filter(function(obj) {
      if(obj.id == id) {
        return obj 
      }
    })[0]
  }

get_my_obj = getById(73, myArray);

1
ObTobiasBeuving - Array.find () භාවිතා කරන තැනැත්තා සරල JS ද වන අතර පළමු සොයා ගැනීම නතර කළහොත් එය වඩාත් කාර්යක්ෂම වනු ඇත.
ඒඩ්‍රියන් ලින්ච්

12

මෙහි නිවැරදි පිළිතුරු බොහෝමයක් තිබුණද, ඔවුන්ගෙන් බොහෝ දෙනෙක් මෙය එක් වරකට වඩා සිදු කරන්නේ නම් මෙය අනවශ්‍ය ලෙස මිල අධික මෙහෙයුමක් බව ආමන්ත්‍රණය නොකරයි. ආන්තික අවස්ථාවක මෙය සැබෑ කාර්ය සාධන ගැටළු වලට හේතුව විය හැකිය.

තථ්‍ය ලෝකයේ, ඔබ බොහෝ අයිතම සැකසෙන්නේ නම් සහ කාර්ය සාධනය සැලකිලිමත් වන්නේ නම් මුලින් බැලීමක් තැනීම වඩා වේගවත් ය:

var items = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];

var lookup = items.reduce((o,i)=>o[i.id]=o,{});

ඔබට නිශ්චිත වේලාවක අයිතම ලබා ගත හැකිය:

var bar = o[id];

බැලීමක් ලෙස වස්තුවක් වෙනුවට සිතියමක් භාවිතා කිරීම ද ඔබට සලකා බැලිය හැකිය: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map


11

ස්වදේශීය භාවිතා කිරීම Array.reduce

var array = [ {'id':'73' ,'foo':'bar'} , {'id':'45' ,'foo':'bar'} , ];
var id = 73;
var found = array.reduce(function(a, b){
    return (a.id==id && a) || (b.id == id && b)
});

සොයාගත හොත් වස්තු මූලද්‍රව්‍යය නැවත ලබා දෙයි false


සටහනක් පමණක්, ArE.reduce IE8 සහ ඊට අඩු සහය නොදක්වයි.
බර්න්_ඊ 99

8

ඔබ මෙය කිහිප වතාවක් කළහොත්, ඔබට සිතියමක් (ES6) සැකසිය හැකිය:

const map = new Map( myArray.map(el => [el.id, el]) );

එවිට ඔබට සරලවම කළ හැකිය:

map.get(27).foo

6

මෙන්න මම පිරිසිදු ජාවාස්ක්‍රිප්ට් වලින් ඒ ගැන යන්නේ කෙසේද, අවම වශයෙන් මට ECMAScript 3 හෝ ඊට පසුව ක්‍රියා කරන බව සිතිය හැකිය. තරඟයක් සොයාගත් වහාම එය නැවත පැමිණේ.

var getKeyValueById = function(array, key, id) {
    var testArray = array.slice(), test;
    while(test = testArray.pop()) {
        if (test.id === id) {
            return test[key];
        }
    }
    // return undefined if no matching id is found in array
    return;
}

var myArray = [{'id':'73', 'foo':'bar'}, {'id':'45', 'foo':'bar'}]
var result = getKeyValueById(myArray, 'foo', '45');

// result is 'bar', obtained from object with id of '45'

5

වඩාත් ජනක හා කෙටි

function findFromArray(array,key,value) {
        return array.filter(function (element) {
            return element[key] == value;
        }).shift();
}

ඔබේ නඩුවේ Ex. var element = findFromArray(myArray,'id',45)එය ඔබට සම්පූර්ණ අංගය ලබා දෙනු ඇත.


4

ඔබට http://sugarjs.com/ වෙතින් සුගර්ජ් අත්හදා බැලිය හැකිය .

එය අරා මත ඉතා මිහිරි ක්‍රමයක් ඇත .find. එබැවින් ඔබට මෙවැනි අංගයක් සොයාගත හැකිය:

array.find( {id: 75} );

තවත් "කොහේද-වගන්තියක්" එකතු කිරීම සඳහා ඔබට වැඩි ගුණාංග සහිත වස්තුවක් යැවිය හැකිය.

සුගර්ජ් ස්වදේශික වස්තූන් විහිදුවන බව සලකන්න, සමහර අය මෙය ඉතා නපුරක් ලෙස සලකති ...


2
හොඳයි, එය වේ එය නව සම්මතයන් සංස්කරණ ම නම සඳහා නව ක්රියාමාර්ග හඳුන්වා හැකි බව සිදු විය හැකි බැවින්, නපුරු. අනුමාන කරන්න, මෙය හරියටම සිදුවූයේ එයයිfind . මගේ යෝජනාව නම්, ඔබට ස්වදේශික මූලාකෘති දීර් extend කිරීමට අවශ්‍ය නම්, සෑම විටම වඩාත් නිශ්චිත නම් භාවිතා කරන්න, සරලම ඒවා අනාගත සම්මත වර්ධනයන් සඳහා තබන්න.
මැක්ස්ආර්ට්

මෙම ප්‍රකාශය අවුරුදු 2 කට ආසන්න වන අතර අද මම කෙසේ හෝ ලොඩාෂ් භාවිතා කරමි. කෙසේ වෙතත් ඔබට අවශ්‍ය නම් සීනිජස් වෙබ් අඩවියේ මෙම මාතෘකාව ගැන කියවිය හැකිය. ඔවුන් ඔබේ මතයට හොඳ ස්ථාවරයක් ගනී: sugarjs.com/native
deepflame

1
මෙම ප්‍රකාශය විශේෂයෙන් ජාවාස්ක්‍රිප්ට් හෝ jquery විසඳුමක් ඉල්ලා සිටියේය
ටොබියාස් බුවිං

4

පිළිගත් පිළිතුර මත ගොඩනැගීම:

jQuery:

var foo = $.grep(myArray, function(e){ return e.id === foo_id})
myArray.pop(foo)

හෝ කෝපි ස්ක්‍රිප්ට්:

foo = $.grep myArray, (e) -> e.id == foo_id
myArray.pop foo

4

මෑතකදී, මට විශාල අරාවකින් නූල සෙවීමට අවශ්‍ය දෙයටම මුහුණ දීමට සිදුවිය.

සමහර සෙවීම් වලින් පසුව මට පෙනී ගියේ සරල කේතයක් සමඟ හැසිරවීම පහසු වනු ඇති බවයි:

කේතය:

var items = mydata.filter(function(item){
    return item.word.toLowerCase().startsWith( 'gk );
})

Https://jsfiddle.net/maheshwaghmare/cfx3p40v/4/ බලන්න

20k නූල් වලින් සෙරාච්


3

අරාවෙහි ඇති ඕනෑම අයිතමයක් ගැන අනුමාන කරන්න. ඔබ පිවිසෙන සෑම අයිතමයක් සඳහාම, එම අයිතමයේ හැඳුනුම්පත පරීක්ෂා කරන්න. එය තරඟයක් නම්, එය ආපසු දෙන්න.

ඔබට තේ කෝඩෙස් අවශ්‍ය නම්:

function getId(array, id) {
    for (var i = 0, len = array.length; i < len; i++) {
        if (array[i].id === id) {
            return array[i];
        }
    }
    return null; // Nothing found
}

ECMAScript 5 හි අරා ක්‍රම භාවිතා කරන එකම දේ:

function getId(array, id) {
    var obj = array.filter(function (val) {
        return val.id === id;
    });

    // Filter returns an array, and we just want the matching item.
    return obj[0];
}

3

බ්‍රව්සරය ECMA-262 , 5 වන සංස්කරණයට (2009 දෙසැම්බර්) සහය දක්වන තාක් කල් , මෙය ක්‍රියාත්මක විය යුතුය, එක් ලයිනර් පාහේ:

var bFound = myArray.some(function (obj) {
    return obj.id === 45;
});

2
පාහේ. මූලද්‍රව්‍යයක් අවශ්‍ය තත්ත්වය සපුරාලන්නේ නම් bFoundඑය බූලියන් පමණි true.
මැක්ස්ආර්ට්

3

අරා සඳහා සාදන ලද “පෙරහන්” ශ්‍රිතය භාවිතා කිරීමෙන් ඔබට මෙය පිරිසිදු ජාවාස්ක්‍රිප්ට් තුළ පවා කළ හැකිය:

Array.prototype.filterObjects = function(key, value) {
    return this.filter(function(x) { return x[key] === value; })
}

එබැවින් දැන් වෙනුවට "id" keyසහ "45" වෙනුවට සම්මත කරන්න value, එවිට ඔබට සම්පූර්ණ වස්තුව 45 හැඳුනුම්පතකට ගැලපේ. එබැවින් එය එසේ වනු ඇත.

myArr.filterObjects("id", "45");

16
ඔබට අයිති නැති වස්තු වෙනස් නොකරන්න.
මයිකල් පෙරකෝව්ස්කි

3

Array.prototype.filter()ශ්‍රිතය භාවිතා කරන්න .

ඩෙමෝ : https://jsfiddle.net/sumitridhal/r0cz0w5o/4/

JSON

var jsonObj =[
 {
  "name": "Me",
  "info": {
   "age": "15",
   "favColor": "Green",
   "pets": true
  }
 },
 {
  "name": "Alex",
  "info": {
   "age": "16",
   "favColor": "orange",
   "pets": false
  }
 },
{
  "name": "Kyle",
  "info": {
   "age": "15",
   "favColor": "Blue",
   "pets": false
  }
 }
];

පෙරහන

var getPerson = function(name){
    return jsonObj.filter(function(obj) {
      return obj.name === name;
    });
}

කැදැලි වස්තුව තුළ මා සෙවිය හැක්කේ කෙසේද? සුරතල් සතුන් මෙන් = අසත්‍යය වස්තු දෙකක් ආපසු ලබා දිය යුතුය.
වලේ

කැදැලි ලූපයේ .filterක්‍රමය භාවිතා කරන්න obj.info. var getPerson = function(name){ return jsonObj.filter(function(obj) { return obj.info.filter(function(info) { return pets === false; }); }); }
සුමිත් රිදල්

ඔබට es6 ශෛලිය ද භාවිතා කළ හැකිය ... const filterData = jsonObj.filter (obj => obj.name === 'ඇලෙක්ස්')
DagicCross

3

අපට Jquery ක්‍රම භාවිතා කළ හැකිය $.each()/$.grep()

var data= [];
$.each(array,function(i){if(n !== 5 && i > 4){data.push(item)}}

හෝ

var data = $.grep(array, function( n, i ) {
  return ( n !== 5 && i > 4 );
});

ES6 සින්ටැක්ස් භාවිතා කරන්න:

Array.find, Array.filter, Array.forEach, Array.map

නැතහොත් ලොඩාෂ් https://lodash.com/docs/4.17.10#filter , Underscore https://underscorejs.org/#filter භාවිතා කරන්න


2

ආරොන් ඩිගුල්ලා විසින් සපයන ලද පිළිතුරට මම සැබවින්ම කැමතියි, නමුත් මගේ වස්තූන් පෙළ තබා ගැනීමට අවශ්‍ය වූ අතර පසුව එය නැවත කියවීමට මට හැකි විය. ඒ නිසා මම එය වෙනස් කළා

	var indexer = {};
	for (var i = 0; i < array.length; i++) {
	    indexer[array[i].id] = parseInt(i);
	}
	
	//Then you can access object properties in your array using 
	array[indexer[id]].property


අරාවෙහි ඇති අයිතම සොයා ගැනීම සඳහා වේගවත්ම විසඳුම භාවිතා කරයි. නමුත් මෙහි parseInt අතිරික්ත වේ.
aleha

1

භාවිත:

var retObj ={};
$.each(ArrayOfObjects, function (index, obj) {

        if (obj.id === '5') { // id.toString() if it is int

            retObj = obj;
            return false;
        }
    });
return retObj;

එය වස්තුවක් හැඳුනුම්පත මගින් ආපසු ලබා දිය යුතුය.


return obj.id === 5 භාවිතා කිරීමෙන් ඔබේ කේතය කෙටි කළ හැකිද? obj: අසත්ය; මම $ .ආරයි හරහා නැවත යෙදීම සඳහා බොහෝ දේ භාවිතා කරමි.
මාර්සෙල්

@marcel: ඒක වැඩ කරන්නේ නැහැ. සාවද්‍ය ලෙස නැවත පැමිණීම මඟින් ලූපය අවසන් වන බැවින්, එය වස්තුව සොයාගන්නේ එය අරාවෙහි පළමු අයිතමය නම් පමණි.
ගුෆා

1

මෙම විසඳුම ද ප්‍රයෝජනවත් විය හැකිය:

Array.prototype.grep = function (key, value) {
    var that = this, ret = [];
    this.forEach(function (elem, index) {
        if (elem[key] === value) {
            ret.push(that[index]);
        }
    });
    return ret.length < 2 ? ret[0] : ret;
};
var bar = myArray.grep("id","45");

මම එය හරියට සාදා ඇති $.grepඅතර එක් වස්තුවක් සොයාගත හොත්, ශ්‍රිතය අරාවකට වඩා වස්තුව නැවත ලබා දෙනු ඇත.


2
ඔබට අයිති නැති වස්තු වෙනස් නොකරන්න.
මයිකල් පෙරකෝව්ස්කි

Oth ගොත්ඩෝ මම එකඟ වෙමි. යමෙකු නොදැන සිටියේ නම් function will return the object, rather than an arrayවැරැද්දක් සිදුවිය හැකි නමුත් මම හිතන්නේ එය පරිශීලකයින් මත රඳා පවතී.
සෝයා

1

අනෙක් අය පෙන්වා දී ඇති පරිදි, .find()ඔබේ අරාව තුළ එක් වස්තුවක් සොයන විට යා යුතු මාර්ගයයි. කෙසේ වෙතත්, මෙම ක්‍රමය භාවිතයෙන් ඔබේ වස්තුව සොයාගත නොහැකි නම්, ඔබේ වැඩසටහන බිඳ වැටෙනු ඇත:

const myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
const res = myArray.find(x => x.id === '100').foo; // Uh oh!
/*
Error:
"Uncaught TypeError: Cannot read property 'foo' of undefined"
*/

එය .find()භාවිතා කිරීමට පෙර ප්‍රති result ලය නිර්වචනය කර ඇත්දැයි පරීක්ෂා කිරීමෙන් මෙය නිවැරදි කළ හැකිය .foo. නවීන JS අපට විකල්ප දම්වැලකින් පහසුවෙන් මෙය කිරීමට ඉඩ දෙයි undefined, ඔබේ කේතය බිඳ වැටෙනවාට වඩා වස්තුව සොයාගත නොහැකි නම් නැවත පැමිණීම :

const myArray = [{'id':'73','foo':'bar'},{'id':'45','foo':'bar'}];
const res = myArray.find(x => x.id === '100')?.foo; // No error!
console.log(res); // undefined when the object cannot be found


0

සිට ආරම්භ aggaton පිළිතුර , මේ ඇත්තටම අවශ්යව අංගයක් (හෝ නැවත බව ශ්රිතයක් වේ nullදී ඇති, සොයාගත නොහැකි නම්) arrayසහ callbackශ්රිතයේ එම "නිවැරදි" අංගයක් සඳහා truthy අගය බව:

function findElement(array, callback) {
    var elem;
    return array.some(function(e) {
        if (callback(e)) {
            elem = e;
            return true;
        }
    }) ? elem : null;
});

මෙය IE8- මත ස්වදේශීයව ක්‍රියා නොකරන බව මතක තබා ගන්න some. පොලිෆිල් එකක් ලබා දිය හැකිය, විකල්පයක් ලෙස සෑම විටම සම්භාව්‍ය forපුඩුවක් තිබේ:

function findElement(array, callback) {
    for (var i = 0; i < array.length; i++)
        if (callback(array[i])) return array[i];
    return null;
});

එය ඇත්ත වශයෙන්ම වේගවත් හා සංයුක්ත වේ. නමුත් ඔබට රෝදය ප්‍රතිනිර්මාණය කිරීමට අවශ්‍ය නැතිනම්, යටි ඉරි හෝ ලෝඩාෂ් වැනි උපයෝගිතා පුස්තකාලයක් භාවිතා කිරීමට මම යෝජනා කරමි.


0

කෙටිම,

var theAnswerObj = _.findWhere(array, {id : 42});

1
මේ සඳහා යටි ඉරි සහිත පුස්තකාලය භාවිතා කිරීම අවශ්‍ය වේ, OP සරල ජාවාස්ක්‍රිප්ට් හෝ jQuery විසඳුමක් ඉල්ලා සිටියේය
ටොබියාස් බුවිං

2
ඔබ අවධාරනය කළ පසු, මෙය කෙටි පිළිතුරක් නොවේ!
ටිම් ඔගිල්වි
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.