කැදැලි වස්තු, අරා හෝ JSON වෙත ප්‍රවේශ වී ක්‍රියා කරන්නේ කෙසේද?


904

වස්තූන් සහ අරා අඩංගු කූඩු දත්ත ව්‍යුහයක් මා සතුව ඇත. මම තොරතුරු උකහා ගන්නේ කෙසේද, එනම් නිශ්චිත හෝ බහු අගයන් (හෝ යතුරු) වෙත පිවිසෙන්නේ කෙසේද?

උදාහරණයක් වශයෙන්:

var data = {
    code: 42,
    items: [{
        id: 1,
        name: 'foo'
    }, {
        id: 2,
        name: 'bar'
    }]
};

nameදෙවන අයිතමයට ප්‍රවේශ විය හැක්කේ කෙසේද items?


26
Ar මාර්සල්: එය කියවිය යුත්තේ "මට දත්ත කැදැලි දත්ත ව්‍යුහයක් හෝ JSON ඇත, නිශ්චිත අගයකට ප්‍රවේශ වන්නේ කෙසේද?". වෙනස මම දනිමි, නමුත් බොහෝ අය "වස්තුව" වෙනුවට "JSON" සොයන්නේ නැත. බොහෝ ප්‍රශ්න ඇත්ත වශයෙන්ම "මෙම JSON හි X වෙත ප්‍රවේශ වන්නේ කෙසේද" යන ස්වරූපයෙන් වේ. මගේ පිළිතුරේ JSON ගැන සඳහන් කරන එකම ස්ථානය එය කුමක්දැයි මා පැහැදිලි කරන ස්ථානයයි. මෙය වඩා හොඳ ආකාරයකින් සන්නිවේදනය කරන්නේ කෙසේදැයි ඔබට යෝජනාවක් තිබේ නම්, මම සියල්ලන්ටම කන් දෙමි.
ෆීලික්ස් ක්ලින්ග්


මෙහි ඇති මෙම පිළිතුර ඉතා හොඳින් හා වැනිලා වලට කූඩුවලට පිවිසීමේ ගැටලුව විසඳීමට මට උපකාරී විය : stackoverflow.com/questions/6491463/…
හුවමාරු කරන්න

Answers:


1204

මූලික කරුණු

ජාවාස්ක්‍රිප්ට් සතුව ඇත්තේ එක් දත්ත වර්ගයක් පමණි, ඒවාට බහු අගයන් අඩංගු විය හැකිය: වස්තුව . ක Array වස්තුව විශේෂ ආකාරයකි.

(සරල) වස්තූන් සඳහා ස්වරූපයක් ඇත

{key: value, key: value, ...}

අරා වල ස්වරූපය ඇත

[value, value, ...]

අරා සහ වස්තූන් දෙකම key -> valueව්‍යුහයක් නිරාවරණය කරයි . අරාවෙහි යතුරු සංඛ්‍යාත්මක විය යුතු අතර ඕනෑම නූලක් වස්තු වල යතුර ලෙස භාවිතා කළ හැකිය. යතුරු අගය යුගල "ගුණාංග" ලෙසද හැඳින්වේ .

තිත් අංකනය භාවිතයෙන් ගුණාංග වෙත ප්‍රවේශ විය හැකිය

const value = obj.someProperty;

හෝ වරහන අංකනය , දේපල නම වලංගු ජාවාස්ක්‍රිප්ට් හඳුනාගැනීමේ නමක් [පිරිවිතර] නොවන්නේ නම් , හෝ නම විචල්‍යයක වටිනාකම වේ:

// the space is not a valid character in identifier names
const value = obj["some Property"];

// property name as variable
const name = "some Property";
const value = obj[name];

එම හේතුව නිසා, අරාව මූලද්‍රව්‍ය වෙත ප්‍රවේශ විය හැක්කේ වරහන් අංකනය භාවිතයෙන් පමණි:

const value = arr[5]; // arr.5 would be a syntax error

// property name / index as variable
const x = 5;
const value = arr[x];

ඉන්න ... JSON ගැන කුමක් කිව හැකිද?

JSON යනු XML, YAML, CSV සහ වෙනත් අය මෙන් දත්තවල පෙළ නිරූපණයකි. එවැනි දත්ත සමඟ වැඩ කිරීම සඳහා, එය පළමුව ජාවාස්ක්‍රිප්ට් දත්ත වර්ග, එනම් අරා සහ වස්තු බවට පරිවර්තනය කළ යුතුය (සහ ඒවා සමඟ වැඩ කරන්නේ කෙසේද යන්න දැන් පැහැදිලි කර ඇත). ජාවාස්ක්‍රිප්ට් හි JSON විග්‍රහ කරන්නේ කෙසේද යන ප්‍රශ්නයෙන් JSON විග්‍රහ කරන්නේ කෙසේද? .

වැඩිදුර කියවීමේ තොරතුරු

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



කැදැලි දත්ත ව්‍යුහයන්ට ප්‍රවේශ වීම

කැදැලි දත්ත ව්‍යුහයක් යනු වෙනත් අරා හෝ වස්තූන් වෙත යොමු වන අරාව හෝ වස්තුවකි, එනම් එහි අගයන් අරා හෝ වස්තු වේ. තිත් හෝ වරහන් අංකනය අඛණ්ඩව යෙදීමෙන් එවැනි ව්‍යුහයන්ට ප්‍රවේශ විය හැකිය.

මෙන්න උදාහරණයක්:

const data = {
    code: 42,
    items: [{
        id: 1,
        name: 'foo'
    }, {
        id: 2,
        name: 'bar'
    }]
};

nameදෙවන අයිතමයට ප්‍රවේශ වීමට අපට අවශ්‍ය යැයි උපකල්පනය කරමු .

පියවරෙන් පියවර අපට එය කළ හැකි ආකාරය මෙන්න:

අපට පෙනෙන dataපරිදි වස්තුවක් වන බැවින් අපට එහි ගුණාංගවලට තිත් අංකනය භාවිතයෙන් ප්‍රවේශ විය හැකිය. මෙම itemsපහත සඳහන් පරිදි දේපල ප්රවේශ වේ:

data.items

අගය අරාවකි, එහි දෙවන අංගයට ප්‍රවේශ වීම සඳහා අපට වරහන් අංකනය භාවිතා කළ යුතුය:

data.items[1]

මෙම අගය වස්තුවක් වන අතර nameදේපල වෙත ප්‍රවේශ වීම සඳහා අපි නැවත තිත් අංකනය භාවිතා කරමු . එබැවින් අපට අවසානයේ ලැබෙන්නේ:

const item_name = data.items[1].name;

විකල්පයක් ලෙස, අපට ඕනෑම ගුණාංගයක් සඳහා වරහන් අංකනය භාවිතා කළ හැකිව තිබුණි, විශේෂයෙන් නම් නාමයේ අක්ෂර අඩංගු නම් එය තිත් අංකන භාවිතය සඳහා අවලංගු වනු ඇත:

const item_name = data['items'][1]['name'];

මම දේපලකට ප්‍රවේශ වීමට උත්සාහ කළ නමුත් මට undefinedආපසු ලැබෙන්නේ පමණක්ද ?

ඔබ ලබා ගන්නා බොහෝ විට undefined, වස්තුව / අරාවෙහි එම නම සහිත දේපලක් නොමැත.

const foo = {bar: {baz: 42}};
console.log(foo.baz); // undefined

වස්තුව / අරාවෙහි ව්‍යුහය භාවිතා කිරීම console.logහෝ console.dirපරීක්ෂා කිරීම. ඔබ ප්‍රවේශ වීමට උත්සාහ කරන දේපල සැබවින්ම අර්ථ දැක්විය හැක්කේ කැදැලි වස්තුවක් / අරාවක් මත ය.

console.log(foo.bar.baz); // 42

දේපල නම් ගතික නම් සහ මම ඒවා කලින් නොදැන සිටියහොත් කුමක් කළ යුතුද?

දේපල නම් නොදන්නා නම් හෝ අපට අරාවෙහි වස්තුවක / මූලද්‍රව්‍යයන්ගේ සියලුම ගුණාංග වෙත ප්‍රවේශ වීමට අවශ්‍ය නම්, අපට වස්තු සඳහා [MDN] ලූපය සහ සියලු ගුණාංග / මූලද්‍රව්‍යයන් නැවත සැකසීමට අරා සඳහා for...in [MDN] පුඩුවක් භාවිතා කළ හැකිය .for

වස්තු

සියළුම ගුණාංග ඉක්මවා යෑමට data, අපට වස්තුව මත නැවත නැවත යෙදිය හැකිය :

for (const prop in data) {
    // `prop` contains the name of each property, i.e. `'code'` or `'items'`
    // consequently, `data[prop]` refers to the value of each property, i.e.
    // either `42` or the array
}

වස්තුව පැමිණෙන්නේ කොහෙන්ද (සහ ඔබට කිරීමට අවශ්‍ය දේ) මත පදනම්ව, දේපල සැබවින්ම වස්තුවක දේපලක්ද, නැතහොත් එය උරුම වූ දේපලක්ද යන්න එක් එක් නැවතීමේ දී ඔබට පරීක්ෂා කිරීමට සිදු විය හැකිය. ඔබට මෙය Object#hasOwnProperty [MDN] සමඟ කළ හැකිය .

for...inසමඟ විකල්පයක් ලෙස hasOwnProperty, ඔබට දේපල නම් රාශියක් ලබා ගැනීමට Object.keys [MDN] භාවිතා කළ හැකිය :

Object.keys(data).forEach(function(prop) {
  // `prop` is the property name
  // `data[prop]` is the property value
});

අරා

data.items අරාවේ සියලුම මූලද්‍රව්‍යයන් නැවත සැකසීමට , අපි forලූපයක් භාවිතා කරමු :

for(let i = 0, l = data.items.length; i < l; i++) {
    // `i` will take on the values `0`, `1`, `2`,..., i.e. in each iteration
    // we can access the next element in the array with `data.items[i]`, example:
    // 
    // var obj = data.items[i];
    // 
    // Since each element is an object (in our example),
    // we can now access the objects properties with `obj.id` and `obj.name`. 
    // We could also use `data.items[i].id`.
}

for...inඅරා හරහා නැවත යෙදීම සඳහා යමෙකුට භාවිතා කළ හැකි නමුත් මෙය වළක්වා ගත යුතු හේතු තිබේ: ජාවාස්ක්‍රිප්ට් හි අරා සමඟ 'සඳහා (ලැයිස්තුවේ ඇති අයිතම අයිතමය)' සඳහා ඇයි? .

ECMAScript 5 හි වැඩි වන බ්‍රව්සර් සහාය සමඟ, අරාව ක්‍රමය forEach [MDN] සිත්ගන්නා විකල්පයක් බවට පත්වේ:

data.items.forEach(function(value, index, array) {
    // The callback is executed for each element in the array.
    // `value` is the element itself (equivalent to `array[index]`)
    // `index` will be the index of the element in the array
    // `array` is a reference to the array itself (i.e. `data.items` in this case)
}); 

ES2015 (ES6) සඳහා සහය දක්වන පරිසරවලදී, ඔබට [MDN] පුඩුවක් භාවිතා කළ හැකිය , එය අරා සඳහා පමණක් නොව ඕනෑම නැවත ක්‍රියාත්මක කළ හැකි දේ සඳහාද ක්‍රියා කරයි :for...of

for (const item of data.items) {
   // `item` is the array element, **not** the index
}

එක් එක් පුනරාවර්තනයේ දී, for...ofනැවත නැවත යෙදිය හැකි ඊළඟ අංගය අපට ලබා දෙයි , ප්‍රවේශ වීමට හෝ භාවිතා කිරීමට "දර්ශකයක්" නොමැත.


දත්ත ව්‍යුහයේ “ගැඹුර” මා නොදන්නේ නම් කුමක් කළ යුතුද?

නොදන්නා යතුරු වලට අමතරව, දත්ත ව්‍යුහයේ “ගැඹුර” (එනම් එහි ඇති කැදැලි වස්තූන් කීයක්) ද නොදැන සිටිය හැකිය. ගැඹුරට කැදැලි සහිත දේපල වලට ප්‍රවේශ වන්නේ කෙසේද යන්න සාමාන්‍යයෙන් රඳා පවතින්නේ නිශ්චිත දත්ත ව්‍යුහය මත ය.

නමුත් දත්ත ව්‍යුහයේ පුනරාවර්තන රටා තිබේ නම්, උදා: ද්විමය ගසක් නිරූපණය කිරීම, විසඳුමට සාමාන්‍යයෙන් ඇතුළත් වන්නේ දත්ත ව්‍යුහයේ සෑම මට්ටමකටම පුනරාවර්තන ලෙස [විකිපීඩියා] ප්‍රවේශ වීමයි.

ද්විමය ගසක පළමු පත්‍ර නෝඩය ලබා ගැනීම සඳහා උදාහරණයක් මෙන්න:

function getLeaf(node) {
    if (node.leftChild) {
        return getLeaf(node.leftChild); // <- recursive call
    }
    else if (node.rightChild) {
        return getLeaf(node.rightChild); // <- recursive call
    }
    else { // node must be a leaf node
        return node;
    }
}

const first_leaf = getLeaf(root);

නොදන්නා යතුරු සහ ගැඹුර සහිත කැදැලි දත්ත ව්‍යුහයකට ප්‍රවේශ වීම සඳහා වඩාත් පොදු ක්‍රමයක් වන්නේ වටිනාකමේ වර්ගය පරීක්ෂා කර ඒ අනුව ක්‍රියා කිරීමයි.

කැදැලි දත්ත ව්‍යුහයක් තුළ ඇති සියළුම ප්‍රාථමික අගයන් අරාවකට එකතු කරන උදාහරණයකි (එහි කිසිදු කාර්යයක් නොමැති බව උපකල්පනය කරන්න). අපට යම් වස්තුවක් (හෝ අරාව) හමු වුවහොත් අපි toArrayනැවත එම අගය (පුනරාවර්තන ඇමතුම) අමතන්නෙමු.

function toArray(obj) {
    const result = [];
    for (const prop in obj) {
        const value = obj[prop];
        if (typeof value === 'object') {
            result.push(toArray(value)); // <- recursive call
        }
        else {
            result.push(value);
        }
    }
    return result;
}



උදව්කරුවන්

සංකීර්ණ වස්තුවක හෝ අරාවක ව්‍යුහය අත්‍යවශ්‍යයෙන්ම නොපෙනෙන හෙයින්, තවදුරටත් ඉදිරියට යා යුතු ආකාරය තීරණය කිරීම සඳහා අපට සෑම පියවරකදීම වටිනාකම පරීක්ෂා කළ හැකිය. console.log [MDN] සහ console.dir [MDN] මෙය කිරීමට අපට උදව් කරයි. උදාහරණයක් ලෙස (ක්‍රෝම් කොන්සෝලයේ ප්‍රතිදානය):

> console.log(data.items)
 [ Object, Object ]

මෙහිදී අපට පෙනෙන්නේ data.itemsඑය වස්තූන් දෙකම වන මූලද්‍රව්‍ය දෙකක් සහිත අරාවකි. ක්‍රෝම් කොන්සෝලය තුළ වස්තූන් පුළුල් කර වහාම පරීක්ෂා කළ හැකිය.

> console.log(data.items[1])
  Object
     id: 2
     name: "bar"
     __proto__: Object

මෙය අපට පවසන්නේ data.items[1]එය වස්තුවක් වන අතර එය පුළුල් කිරීමෙන් පසුව එයට ගුණාංග තුනක් ඇති බව අපට පෙනේ id, nameසහ __proto__. දෙවැන්න වස්තුවේ මූලාකෘති දාමය සඳහා භාවිතා කරන අභ්‍යන්තර දේපලකි. මූලාකෘති දාමය සහ උරුමය මෙම පිළිතුර සඳහා විෂය පථයෙන් බැහැර ය.


3
මෙහි සම්බන්ධ කර ඇති සමහර දේ ඇත්ත වශයෙන්ම jQuery හි මෙය කරන්නේ කෙසේදැයි විමසයි, එය සාධාරණ නම් මෙහි 1 හෝ 2 දේවල් සරල කරයි. මෙය මෙගාපොස්ට් වලින් වැඩි ප්‍රමාණයක් ලබා ගන්නේද නැතිනම් ඒවාට වෙන වෙනම පිළිතුරු දිය යුතුද යන්න නිශ්චිත නැත - මෙහි ඇති මූලික කරුණු වස්තුවක් යනු කුමක්ද යන්න පිළිබඳව මෙහි ආවරණය වන මූලික කරුණු සාමාන්‍යයෙන් සැබවින්ම අසනු ලබන්නේ ....
ක්‍රිස් මොස්චිනි

1
@ felix-kling එක් දෙයක් ... වැනි කැදැලි සහිත වස්තූන් සමඟ let object = {a: 1, b: 2, c: { a: 3, b: 4 }};, මෙය එක් එක් කැදැලි වස්තුව සඳහා අරාවක් අඩංගු අරාවක් ලබා දෙයි, මේ අවස්ථාවේ [ 1, 2, [ 3, 4 ] ]දී තල්ලු කිරීම වෙනුවට පුනරාවර්තන ඇමතුමෙහි කොන්ක්‍රීට් භාවිතා කිරීම වඩා හොඳ නොවේ ද? (
ප්‍රති result ලය

3
Stack Overflow හි මා මෙතෙක් දැක ඇති වඩාත්ම ගැඹුරු පිළිතුර මෙයයි - එය මගේ ප්‍රශ්නයට පිළිතුරු සපයයි! ස්තූතියි!
විලියම් ජෝන්ස්

මෙම එක් පිටුවක් මට ARRAY සහ OBJ අතර වෙනස ඉගෙන ගැනීමට හේතු විය
4ni5

සමස්ත StackOverflow හි මෙය හොඳම පිළිතුර විය හැකිය!
වලි

79

ඔබට එය මේ ආකාරයෙන් ප්‍රවේශ කළ හැකිය

data.items[1].name

හෝ

data["items"][1]["name"]

ක්‍රම දෙකම එක හා සමානයි.


1
ඔව්, නමුත් ඔබට දත්ත ["අයිතම"] කළ නොහැක. 1. නම
නියුමුසික්

6
පළමුවැන්න වඩා බුද්ධිමත්, කියවිය හැකි සහ කෙටි ය;) වරහන් දේපල සින්ටැක්ස් භාවිතා කිරීමට මම කැමැත්තක් දක්වන්නේ දේපල නම විචල්‍ය වූ විට පමණි.
DanteTheSmith

1
aneaumusic ඔබට එයට අවශ්‍ය ඇයි?
විවේක් සිං

35

itemඋදාහරණ ව්‍යුහයෙන් ඔබ අරාවෙහි පිහිටීම නොදැන idහෝ ප්‍රවේශ වීමට උත්සාහ nameකරන්නේ නම්, එය කිරීමට ඇති පහසුම ක්‍රමය වනුයේ underscore.js පුස්තකාලය භාවිතා කිරීමයි :

var data = {
    code: 42,
    items: [{
        id: 1,
        name: 'foo'
    }, {
        id: 2,
        name: 'bar'
    }]
};

_.find(data.items, function(item) {
  return item.id === 2;
});
// Object {id: 2, name: "bar"}

මගේ අත්දැකීම් අනුව, කේතය වෙනුවට ඉහළ ඇණවුම් ශ්‍රිත භාවිතා කිරීම forහෝ for..inතර්ක කිරීම පහසු වන අතර එමඟින් වඩාත් නඩත්තු කළ හැකිය.

මගේ ශත 2 යි.


32

වස්තු සහ අරා වල දත්ත සැකසීමට ඔබට උදව් කළ හැකි ගොඩනංවන ක්‍රම රාශියක් ඇත.

සටහන: බොහෝ උදාහරණ වල මම ඊතල ශ්‍රිත භාවිතා කරමි . ඒවා ක්‍රියාකාරී ප්‍රකාශන වලට සමාන ය , නමුත් ඒවා thisඅගය ශබ්දකෝෂයෙන් බැඳේ.

Object.keys(), Object.values()(ES 2017) සහ Object.entries()(ES 2017)

Object.keys()වස්තුවේ යතුරු Object.values()සමූහයක් ලබා දෙයි, වස්තුවේ අගයන් Object.entries()සමූහයක් ලබා දෙයි , සහ වස්තුවක යතුරු සහ අනුරූප අගයන් ආකෘතියකින් ලබා දෙයි [key, value].

const obj = {
  a: 1
 ,b: 2
 ,c: 3
}

console.log(Object.keys(obj)) // ['a', 'b', 'c']
console.log(Object.values(obj)) // [1, 2, 3]
console.log(Object.entries(obj)) // [['a', 1], ['b', 2], ['c', 3]]

Object.entries() ලූපයක් සහ විනාශකාරී පැවරුමක් සමඟ

const obj = {
  a: 1
 ,b: 2
 ,c: 3
}

for (const [key, value] of Object.entries(obj)) {
  console.log(`key: ${key}, value: ${value}`)
}

එහි ප්රතිඵලයක් වඩාත් කැපීපෙනේ කිරීමට ඉතා පහසු වේ Object.entries()සමඟ සඳහා-ක පුඩුවක් හා destructuring පැවරුම .

For-of loop ඔබට අරාව මූලද්‍රව්‍ය නැවත සැකසීමට ඉඩ දෙයි. කාරක රීති බොහෝදුරට වේ for (const element of array)(අපි විස්ථාපනය කල හැකි constසමග varහෝ let, නමුත් එය භාවිතය වඩා හොඳය constවෙනස් කිරීමට අපි අදහස් නැති නම් element).

පැවරුම් විනාශ කිරීම මඟින් අරාවකින් හෝ වස්තුවකින් අගයන් උකහා ගෙන ඒවා විචල්‍යයන්ට පැවරීමට ඔබට ඉඩ සලසයි. මෙම අවස්ථාවෙහිදී const [key, value]අදහස් කරන්නේ [key, value]අරාව වෙත පැවරීම වෙනුවට element, අපි එම අරාවෙහි පළමු මූලද්‍රව්‍යය keyසහ දෙවන මූලද්‍රව්‍යය පැවරීමයි value. එය මෙයට සමාන ය:

for (const element of Object.entries(obj)) {
  const key = element[0]
       ,value = element[1]
}

ඔබට පෙනෙන පරිදි, විනාශ කිරීම මෙය බෙහෙවින් සරල කරයි.

Array.prototype.every() සහ Array.prototype.some()

මෙම every()ක්රමය ප්රතිලාභ trueඑම නිශ්චිත callback ශ්රිතයේ නම් trueසඳහා සෑම අරාව අංගයක්. මෙම some()ක්රමය ප්රතිලාභ trueඑම නිශ්චිත callback ශ්රිතයේ නම් trueසඳහා සමහර (අවම වශයෙන් එකක්) අංගයක්.

const arr = [1, 2, 3]

// true, because every element is greater than 0
console.log(arr.every(x => x > 0))
// false, because 3^2 is greater than 5
console.log(arr.every(x => Math.pow(x, 2) < 5))
// true, because 2 is even (the remainder from dividing by 2 is 0)
console.log(arr.some(x => x % 2 === 0))
// false, because none of the elements is equal to 5
console.log(arr.some(x => x === 5))

Array.prototype.find() සහ Array.prototype.filter()

මෙම find()ක්‍රම මඟින් සපයා ඇති ඇමතුම් ආපසු ගැනීමේ කාර්යය තෘප්තිමත් කරන පළමු අංගය නැවත ලබා දේ. මෙම filter()ක්‍රමය මඟින් සපයා ඇති ඇමතුම් ආපසු ගැනීමේ කාර්යය තෘප්තිමත් කරන සියලුම අංග සමූහයක් ලබා දෙයි.

const arr = [1, 2, 3]

// 2, because 2^2 !== 2
console.log(arr.find(x => x !== Math.pow(x, 2)))
// 1, because it's the first element
console.log(arr.find(x => true))
// undefined, because none of the elements equals 7
console.log(arr.find(x => x === 7))

// [2, 3], because these elements are greater than 1
console.log(arr.filter(x => x > 1))
// [1, 2, 3], because the function returns true for all elements
console.log(arr.filter(x => true))
// [], because none of the elements equals neither 6 nor 7
console.log(arr.filter(x => x === 6 || x === 7))

Array.prototype.map()

map()අරාවෙහි මූලද්‍රව්‍යයන් මත සපයා ඇති ඇමතුම් ආපසු ගැනීමේ ශ්‍රිතයක් ඇමතීමේ ප්‍රති with ල සමඟ මෙම ක්‍රමය අරාව ලබා දෙයි.

const arr = [1, 2, 3]

console.log(arr.map(x => x + 1)) // [2, 3, 4]
console.log(arr.map(x => String.fromCharCode(96 + x))) // ['a', 'b', 'c']
console.log(arr.map(x => x)) // [1, 2, 3] (no-op)
console.log(arr.map(x => Math.pow(x, 2))) // [1, 4, 9]
console.log(arr.map(String)) // ['1', '2', '3']

Array.prototype.reduce()

මෙම reduce()ක්‍රමය මඟින් මූලද්‍රව්‍ය දෙකක් සහිත සපයා ඇති ඇමතුම් ආපසු ගැනීමේ ශ්‍රිතය ඇමතීමෙන් අරාව තනි අගයකට අඩු කරයි.

const arr = [1, 2, 3]

// Sum of array elements.
console.log(arr.reduce((a, b) => a + b)) // 6
// The largest number in the array.
console.log(arr.reduce((a, b) => a > b ? a : b)) // 3

මෙම reduce()ක්‍රමය විකල්ප දෙවන පරාමිතියක් ගනී, එය ආරම්භක අගය වේ. ඔබ අමතන අරාවෙහි reduce()ශුන්‍ය හෝ එක් මූලද්‍රව්‍යයක් තිබිය හැකි විට මෙය ප්‍රයෝජනවත් වේ . උදාහරණයක් ලෙස, sum()අරාවක් තර්කයක් ලෙස ගෙන සියලු මූලද්‍රව්‍යයන්ගේ එකතුව ලබා දෙන ශ්‍රිතයක් නිර්මාණය කිරීමට අපට අවශ්‍ය නම් , අපට එය එසේ ලිවිය හැකිය:

const sum = arr => arr.reduce((a, b) => a + b, 0)

console.log(sum([]))     // 0
console.log(sum([4]))    // 4
console.log(sum([2, 5])) // 7


මෙය මගේ ප්‍රියතම පිළිතුරයි. ඔබ ද ආදර්ශයක් පුඩුවක් සඳහා හුදෙක් expecific පිලිතුරු කැදැලි දත්ත, වැනි එකතු කළ හැකි යObject.keys(data["items"]).forEach(function(key) { console.log(data["items"][key].id); console.log(data["items"][key].name); });
SilverSurfer

26

සමහර අවස්ථාවලදී, නූලක් භාවිතයෙන් කැදැලි වස්තුවකට ප්‍රවේශ වීම යෝග්‍ය වේ. සරල ප්රවේශය පළමු මට්ටම වේ, උදාහරණයක් ලෙස

var obj = { hello: "world" };
var key = "hello";
alert(obj[key]);//world

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

ප්රවේශ වන දේපල දැනටමත් දන්නා නමුත් මාර්ගය සංකීර්ණ නම්, උදාහරණයක් ලෙස මෙම වස්තුවෙහි

var obj = {
 arr: [
    { id: 1, name: "larry" },    
    { id: 2, name: "curly" },
    { id: 3, name: "moe" }
 ]
};

තවද, වස්තුවෙහි අරාවෙහි පළමු ප්‍රති result ලය ලබා ගැනීමට ඔබට අවශ්‍ය බව ඔබ දන්නවා, සමහර විට ඔබ භාවිතා කිරීමට කැමති වනු ඇත

var moe = obj["arr[0].name"];

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

function flatten(obj){
 var root = {};
 (function tree(obj, index){
   var suffix = toString.call(obj) == "[object Array]" ? "]" : "";
   for(var key in obj){
    if(!obj.hasOwnProperty(key))continue;
    root[index+key+suffix] = obj[key];
    if( toString.call(obj[key]) == "[object Array]" )tree(obj[key],index+key+suffix+"[");
    if( toString.call(obj[key]) == "[object Object]" )tree(obj[key],index+key+suffix+".");   
   }
 })(obj,"");
 return root;
}

දැන්, සංකීර්ණ වස්තුව සමතලා කළ හැකිය

var obj = previous definition;
var flat = flatten(obj);
var moe = flat["arr[0].name"];//moe

මෙන්න jsFiddle Demoමෙම ප්රවේශය භාවිතා කරනු ලැබේ.


WTH obj["arr[0].name"]වෙනුවට භාවිතා කිරීමට ඔබට අවශ්‍යද obj.arr[0].name? අනුක්‍රමිකකරණය හැරුණු විට ඔබට සමතලා වූ වස්තූන් සමඟ කටයුතු කිරීමට අවශ්‍ය නැත .
බර්ගි

1
Er බර්ගි - මම මෙම ප්‍රශ්නය පොදුවේ දකින අතර මෙය කැනොනිකල් ලෙස භාවිතා වන බැවින් මම එහි අනුවාදයට පිළිතුරක් පළ කළෙමි. එය වළක්වා ගත හැකි නම් obj.arr [0] .name භාවිතා කිරීම වඩා වේගවත් වේ, නමුත් සමහර විට මිනිසුන්ට නූල් පිවිසුම් කරුවන් පසුකර යාමට අවශ්‍ය වන අතර මෙය සිදු කිරීම සඳහා උදාහරණයකි.
ට්‍රැවිස් ජේ

උර්ග්. තවමත්, සම්පූර්ණ වස්තුව සමතලා කිරීමට හේතුවක් නැතිනම් තනි නූල් මාර්ගයක් භාවිතා කිරීම පමණි, ඔබට එය විග්‍රහ කර ගතික සොයා බැලීමක් කළ හැකිය.
බර්ගි

14

සමකාලීන යාවත්කාලීන කිරීමක් ලෙස මෙම ප්‍රශ්නය තරමක් පැරණි ය. ES2015 ආරම්භයත් සමඟ ඔබට අවශ්‍ය දත්ත ලබා ගැනීමට විකල්ප තිබේ. කැදැලි වස්තූන් වෙත ප්‍රවේශ වීම සඳහා වස්තු විනාශ කිරීම නමින් අංගයක් දැන් තිබේ .

const data = {
  code: 42,
  items: [{
    id: 1,
    name: 'foo'
  }, {
    id: 2,
    name: 'bar'
  }]
};

const {
  items: [, {
    name: secondName
  }]
} = data;

console.log(secondName);

ඉහත උදාහරණය නම් විචල්ය නිර්මාණය secondNameසිට nameකැඳවා මාලාවක් සිට ප්රධාන items, පාළු ,අරාව ප්රථම වස්තුව මඟ පවසයි.

සරල අරා ඇක්සස් කියවීම පහසු බැවින් මෙම උදාහරණය සඳහා එය අධික ලෙස මරා දැමිය හැකි නමුත් පොදුවේ වස්තූන් වෙන් කිරීමේදී එය ප්‍රයෝජනවත් වේ.

මෙය ඔබගේ විශේෂිත භාවිත අවස්ථාව පිළිබඳ ඉතා කෙටි හැඳින්වීමකි, විනාශ කිරීම මුලදී පුරුදු වීමට අසාමාන්‍ය වාක්‍ය ඛණ්ඩයක් විය හැකිය. වැඩිදුර දැන ගැනීම සඳහා මොසිල්ලා හි විනාශකාරී පැවරුම් ලේඛන කියවීමට මම නිර්දේශ කරමි .


13

කැදැලි ලක්ෂණයකට ප්‍රවේශ වීම සඳහා, ඔබ එහි නම සඳහන් කර වස්තුව හරහා සෙවිය යුතුය.

ඔබ දැනටමත් නිශ්චිත මාර්ගය දන්නවා නම්, ඔබට එය ඔබගේ ස්ක්‍රිප්ටයේ දෘඩ කේත කළ හැකිය:

data['items'][1]['name']

මේවා ද ක්‍රියාත්මක වේ -

data.items[1].name
data['items'][1].name
data.items[1]['name']

ඔබ අත පෙර නිශ්චිත නම නොදන්නා විට හෝ ඔබ වෙනුවෙන් නම සපයන පරිශීලකයා වේ. එවිට දත්ත ව්‍යුහය හරහා ගතිකව සෙවීම අවශ්‍ය වේ. සමහරු මෙහි යෝජනා කළේ forලූපයක් භාවිතයෙන් සෙවීම කළ හැකි නමුත් භාවිතා කරමින් මාර්ගයක් ගමන් කිරීමට ඉතා සරල ක්‍රමයක් ඇති Array.reduceබවයි.

const data = { code: 42, items: [{ id: 1, name: 'foo' }, { id: 2, name: 'bar' }] }
const path = [ 'items', '1', 'name']
let result = path.reduce((a,v) => a[v], data)

මාර්ගය කීමට ක්‍රමයක්: පළමුව වස්තුව යතුර සමඟ රැගෙන යන්න items, එය අරාවකි. ඉන්පසු 1-st මූලද්‍රව්‍යය (දර්ශක අරා 0) ගන්න. අවසාන nameවශයෙන් එම අරාව මූලද්‍රව්‍යයේ යතුර සමඟ වස්තුව ගන්න , එය නූල් barවේ.

ඔබට ඉතා දිගු මාර්ගයක් තිබේ නම්, ඔබට String.splitමේ සියල්ල පහසු කිරීමට පවා භාවිතා කළ හැකිය -

'items.1.name'.split('.').reduce((a,v) => a[v], data)

JQuery හෝ ලොඩාෂ් වැනි තෙවන පාර්ශවීය පුස්තකාල භාවිතා නොකර මෙය සරල ජාවාස්ක්‍රිප්ට් ය.


13
var ourStorage = {


"desk":    {
    "drawer": "stapler"
  },
"cabinet": {
    "top drawer": { 
      "folder1": "a file",
      "folder2": "secrets"
    },
    "bottom drawer": "soda"
  }
};
ourStorage.cabinet["top drawer"].folder2; // Outputs -> "secrets"

හෝ

//parent.subParent.subsubParent["almost there"]["final property"]

මූලික වශයෙන්, එක් එක් පරම්පරාවට යටින් දිග හැරෙන තිතක් භාවිතා කරන්න, ඔබට නූල් දෙකකින් සෑදී ඇති වස්තු නම් ඇති විට, ඔබ [“obj Name”] අංකනය භාවිතා කළ යුතුය. එසේ නොමැති නම්, තිතක් පමණක් ප්‍රමාණවත් වේ;

මුලාශ්‍රය: https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/basic-javascript/accessing-nested-objects

මෙයට එකතු කිරීම සඳහා, කැදැලි අරා වලට ප්‍රවේශ වීම එසේ වනු ඇත:

var ourPets = [
  {
    animalType: "cat",
    names: [
      "Meowzer",
      "Fluffy",
      "Kit-Cat"
    ]
  },
  {
    animalType: "dog",
    names: [
      "Spot",
      "Bowser",
      "Frankie"
    ]
  }
];
ourPets[0].names[1]; // Outputs "Fluffy"
ourPets[1].names[0]; // Outputs "Spot"

මුලාශ්‍රය: https://learn.freecodecamp.org/javascript-algorithms-and-data-structures/basic-javascript/accessing-nested-arrays/

ඉහත තත්වය නිරූපණය කරන තවත් ප්‍රයෝජනවත් ලේඛනයක්: https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Basics#Bracket_notation

තිත් ඇවිදීම හරහා දේපල ප්‍රවේශය: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors#Dot_notation


මෙම සබැඳිය ප්‍රශ්නයට පිළිතුරු සැපයිය හැකි අතර, පිළිතුරේ අත්‍යවශ්‍ය කොටස් මෙහි ඇතුළත් කිරීම සහ යොමු කිරීම සඳහා සබැඳිය සැපයීම වඩා හොඳය. සම්බන්ධිත පිටුව වෙනස් වුවහොත් සබැඳි පමණක් පිළිතුරු අවලංගු විය හැකිය. - සමාලෝචනයෙන්
රොබට්

1
මම පෝස්ට් සංස්කරණය කළා. මිනිසුන් එයට නරක ප්‍රතිචාරයක් දැක්වීමට ඉක්මන් වුවද. ඊළඟ වතාවේ මම පිළිතුරක් ලබා දීමෙන් වැළකී සිටිමි.
ජොනී

1
Idd රිඩික් වැළකී නොසිටින්න, ඔබ සබැඳියක් පමණක් පළ නොකරන බවට වග බලා ගන්න
reggaeguitar

12

ඔබට lodash _getශ්‍රිතය භාවිතා කළ හැකිය :

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');
// => 3

10

ඕනෑම අයෙකු 2017 දී හෝ පසුව මෙම ප්‍රශ්නයට පැමිණ පහසුවෙන් මතක තබා ගත හැකි ක්‍රමයක් සොයන්නේ නම් , ජාවාස්ක්‍රිප්ට් හි කැදැලි වස්තු වෙත පිවිසීම පිළිබඳ සවිස්තරාත්මක බ්ලොග් සටහනක් මෙහි ඇත.

නිර්වචනය නොකළ දේපල 'foo' කියවීමට නොහැකි දෝෂයක්

1. ඔලිවර් ස්ටීල්ගේ කැදැලි වස්තු ප්‍රවේශ රටාව

පහසුම හා පිරිසිදුම ක්‍රමය වන්නේ ඔලිවර් ස්ටීල්ගේ කැදැලි වස්තු ප්‍රවේශ රටාව භාවිතා කිරීමයි

const name = ((user || {}).personalInfo || {}).name;

මෙම අංකනය සමඟ, ඔබ කිසි විටෙකත් එයට නොයනු ඇත

නිර්වචනය නොකළ දේපල 'නම' කියවිය නොහැක .

පරිශීලකයා සිටීදැයි ඔබ මූලිකවම පරීක්ෂා කරයි, එසේ නොවේ නම්, ඔබ මැස්ස මත හිස් වස්තුවක් සාදයි. මේ ආකාරයෙන්, ඊළඟ මට්ටමේ යතුර සෑම විටම පවතින වස්තුවකින් හෝ හිස් වස්තුවකින් ප්‍රවේශ වනු ඇත , නමුත් කිසි විටෙකත් නිර්වචනය නොකළ.

2. අරා අඩු කිරීම භාවිතා කරමින් කැදැලි වස්තු වෙත ප්‍රවේශ වන්න

කැදැලි අරා වලට ප්‍රවේශ වීමට ඔබට ඔබේම අරාව අඩු කළ හැකි ලිවිය හැකිය.

const getNestedObject = (nestedObj, pathArr) => {
    return pathArr.reduce((obj, key) =>
        (obj && obj[key] !== 'undefined') ? obj[key] : undefined, nestedObj);
}

// pass in your object structure as array elements
const name = getNestedObject(user, ['personalInfo', 'name']);

// to access nested array, just pass in array index as an element the path array.
const city = getNestedObject(user, ['personalInfo', 'addresses', 0, 'city']);
// this will return the city from the first address item.

අවම පුස්තකාල කටයුතු විශිෂ්ට වර්ගය ද ඇත typy ඔබ මේ සියල්ල කරන්නේ බව.


3
මෙම ප්‍රශ්නය මූලික වශයෙන් පවතින්නේ පවතින ප්‍රවේශ ගුණාංග පිළිබඳව ය. ඔබ යොමු කරන්නේ කුමක් ද යන්න පිළිබඳව දැනටමත් ප්‍රශ්නයක් තිබේ (සහ දැනටමත් ඔබේ විසඳුම් බොහොමයක් ද ඇතුළුව): ජාවාස්ක්‍රිප්ට් කැදැලි වස්තූන් ආරක්ෂිතව ප්‍රවේශ කිරීම හෝ නූල් යතුර සමඟ කූඩු කළ ජාවාස්ක්‍රිප්ට් වස්තු වෙත ප්‍රවේශ වීම . කෙසේ වෙතත්: "අවාසනාවකට, ඔබට මෙම උපක්‍රමය සමඟ කූඩු අරා වලට ප්‍රවේශ විය නොහැක." ඇයි නැත්තේ? අරා යනු වස්තූන් වන බැවින් එය එසේම ක්‍රියාත්මක විය යුතුය. එය නොමැති තැන ඔබට උදාහරණයක් සැපයිය හැකිද?
ෆීලික්ස් ක්ලින්ග්

1
El ෆීලික්ස්ක්ලිං අපි ඔලිවර් ස්ටීල් රටාව සමඟ අරා වෙත පිවිසීමට උත්සාහ කරන විට, අපට පියාසර කරන විට 'n' දිගින් අරාව නිර්මාණය කිරීමට නොහැකි වන අතර 'නිර්වචනය නොකළ' දෝෂයක් නොමැතිව n වන දර්ශකයට ප්‍රවේශ විය හැකිය. උදා. ((user || {}).address || new Array(3))[1].name
දිනේෂ් පාණ්ඩියන්

4
ඔබ ඔබේ රටාව නිරන්තරයෙන් අදාළ නොකරයි. ...[1].barමූලද්රව්යය නොතිබුනේ නම් ඇත්ත වශයෙන්ම දෝෂයක් ඇති වේ 1. නමුත් එම ද සඳහා එසේ වන ....foo.barනම් fooකෙනෙක් සිටියේ නැත. ඔබ 1වෙනත් දේපල ප්‍රවේශයක් "ආරක්ෂා" කරනවා සේම, ප්‍රවේශ වීම "ආරක්ෂා" කළ යුතුය. අරාව යනු වස්තුවකි. "අරාව මූලද්රව්යයක්" යනු දේපලකි. නිවැරදිව අදාළ (((user || {}).address || {})[1] || {}).nameවේ.
ෆීලික්ස් ක්ලින්ග්

1
මේක නියමයි. ඒක මට මේ විදියට පහර දුන්නේ නැහැ. @FelixKling ට ස්තූතියි, මම බ්ලොග් සටහන් යාවත්කාලීන කරන්නම්.
දිනේෂ් පාණ්ඩියන්

2
Ines දිනේෂ් පාණ්ඩියන් ඔබ ටයිප් කතුවරයා බව ඔබ හෙළි කළ යුතුයි, මම මෙහි පැමිණියේ ඔබේ බ්ලොග් සටහන කියවීමෙන් පසුවයි
reggaeguitar

9

භාවිතා කිරීම ඔබ පුස්තකාලයක් ඇතුළත් කිරීමට කැමති නම් JSONPath කිරීම වඩාත් නම්‍යශීලී විසඳුමක් වනු ඇත: https://github.com/s3u/JSONPath (node ​​සහ browser)

ඔබේ භාවිත අවස්ථාව සඳහා json මාර්ගය වනුයේ:

$..items[1].name

නිසා:

var secondName = jsonPath.eval(data, "$..items[1].name");

1
Eval () භාවිතා කිරීම හොඳ විසඳුමක් නොවේ. ඒ වෙනුවට පළමු පන්තියේ ශ්‍රිතය භාවිතා කළ හැකිය.
pradeep gowda

8

මම කැමතියි JQuery වලට. එය පිරිසිදු හා කියවීමට පහසුය.

$.each($.parseJSON(data), function (key, value) {
  alert(value.<propertyname>);
});

8

ගතිකව බහු මට්ටමේ වස්තුවකට ප්‍රවේශ වීම.

var obj = {
  name: "john doe",
  subobj: {
    subsubobj: {
      names: "I am sub sub obj"
    }
  }
};

var level = "subobj.subsubobj.names";
level = level.split(".");

var currentObjState = obj;

for (var i = 0; i < level.length; i++) {
  currentObjState = currentObjState[level[i]];
}

console.log(currentObjState);

වැඩ කරන ෆෙඩල්: https://jsfiddle.net/andreitodorut/3mws3kjL/


6

ඔබ යම් නිර්ණායක සපුරාලන වස්තු එකක් හෝ කිහිපයක් සොයන්නේ නම් ඔබට විමසුම්- js භාවිතා කර විකල්ප කිහිපයක් තිබේ

//will return all elements with an id larger than 1
data.items.where(function(e){return e.id > 1;});
//will return the first element with an id larger than 1
data.items.first(function(e){return e.id > 1;});
//will return the first element with an id larger than 1 
//or the second argument if non are found
data.items.first(function(e){return e.id > 1;},{id:-1,name:""});

එය ද තිබෙන singleඅතර singleOrDefaultඔවුන් වැනි බොහෝ වැඩ firstහා firstOrDefaultපිළිවෙළින්. එකම වෙනස නම් ඔවුන් වැඩි ගණනක් විසි කරයි තරඟ වඩා හමු කිරීමයි.

විමසුම්-ජේ පිළිබඳ වැඩිදුර විස්තර සඳහා ඔබට මෙම ලිපිය සමඟ ආරම්භ කළ හැකිය


මෙය වැඩිදියුණු කළ හැක්කේ කෙසේදැයි දැන ගැනීමට මම කැමතියි. අදහස් දැක්වීමට සැලකිලිමත්ද?
රූන් එෆ්එස්

6

අන්ඩර්ස්කෝර් ජේඑස් වේ

ජාවාස්ක්‍රිප්ට් පුස්තකාලයක් වන මෙය ප්‍රයෝජනවත් අවුල් ජාලයක් සපයයි functional programming වන මෙය කිසිදු සාදන ලද වස්තුවක් දිගු නොකර උදව්කරුවන්ගේ .

විසඳුමක්:

var data = {
  code: 42,
  items: [{
    id: 1,
    name: 'foo'
  }, {
    id: 2,
    name: 'bar'
  }]
};

var item = _.findWhere(data.items, {
  id: 2
});
if (!_.isUndefined(item)) {
  console.log('NAME =>', item.name);
}

//using find - 

var item = _.find(data.items, function(item) {
  return item.id === 2;
});

if (!_.isUndefined(item)) {
  console.log('NAME =>', item.name);
}

6

පැරණි ප්‍රශ්නය නමුත් කිසිවෙකු සඳහන් නොකළ පරිදි ලොඩාෂ් (අවධාරනය කරන්න).

ඔබ දැනටමත් ඔබේ ව්‍යාපෘතියේ ලොඩාෂ් භාවිතා කරන්නේ නම්, සංකීර්ණ උදාහරණයකින් මෙය කිරීමට අලංකාර ක්‍රමයක් මම සිතමි.

විකල්ප 1

_.get(response, ['output', 'fund', 'data', '0', 'children', '0', 'group', 'myValue'], '')

සමාන:

විකල්ප 2

response.output.fund.data[0].children[0].group.myValue

පළමු හා දෙවන විකල්පය අතර ඇති වෙනස නම් , ඔප්ට් 1 හි ඔබට දෝෂයක් නොලැබෙන මාර්ගයේ එක් ගුණාංගයක් (නිර්වචනය කර නොමැති) තිබේ නම්, එය ඔබට තෙවන පරාමිතිය ලබා දෙයි.

අරා ෆිල්ටර් ලොඩාෂ් සඳහා _.find()නමුත් මම සාමාන්‍ය භාවිතා කිරීමට කැමතියි filter(). නමුත් මම තවමත් සිතන්නේ ඉහත ක්‍රමයයි_.get() ඇත්තෙන්ම සංකීර්ණ දත්ත සමඟ වැඩ කිරීමේදී ඉතා ප්‍රයෝජනවත් බවයි. මම අතීතයේ දී සැබවින්ම සංකීර්ණ ඒපීඅයි වලට මුහුණ දුන් අතර එය පහසුය!

මාතෘකාවෙන් ගම්‍ය වන සැබවින්ම සංකීර්ණ දත්ත හැසිරවීමට විකල්ප සොයන්නේ කාටද එය ප්‍රයෝජනවත් වනු ඇතැයි මම බලාපොරොත්තු වෙමි.


5

ප්‍රශ්න කරන්නා සැලකිලිමත් වන්නේ එක් මට්ටමේ කැදැලි වස්තුවක් ගැන පමණක් යැයි මම නොසිතමි, එබැවින් ගැඹුරින් කැදැලි සහිත ජේසන් වස්තුවක නෝඩයට ප්‍රවේශ වන්නේ කෙසේද යන්න නිරූපණය කිරීම සඳහා මම පහත නිරූපණය ඉදිරිපත් කරමි. හරි, අපි '5' හැඳුනුම්පත සහිත නෝඩය සොයා ගනිමු.

var data = {
  code: 42,
  items: [{
    id: 1,
    name: 'aaa',
    items: [{
        id: 3,
        name: 'ccc'
      }, {
        id: 4,
        name: 'ddd'
      }]
    }, {
    id: 2,
    name: 'bbb',
    items: [{
        id: 5,
        name: 'eee'
      }, {
        id: 6,
        name: 'fff'
      }]
    }]
};

var jsonloop = new JSONLoop(data, 'id', 'items');

jsonloop.findNodeById(data, 5, function(err, node) {
  if (err) {
    document.write(err);
  } else {
    document.write(JSON.stringify(node, null, 2));
  }
});
<script src="https://rawgit.com/dabeng/JSON-Loop/master/JSONLoop.js"></script>


විචල්යයන් භාවිතා කරමින් මම කැදැලි json වස්තුවට ප්රවේශ වන්නේ කෙසේද? data = {a: {b: 'ss'}}; var key = ab data [key] ක්‍රියා නොකරයි
පසුපති රාජමනිකම්

4

2020 දී ඔබට @ බාබෙල් / ප්ලගීන-යෝජනාව-විකල්ප-දාමය භාවිතා කළ හැකිය වස්තුවක කූඩු අගයන් වෙත ප්‍රවේශ වීම ඉතා පහසුය.

 const obj = {
 foo: {
   bar: {
     baz: class {
   },
  },
 },
};

const baz = new obj?.foo?.bar?.baz(); // baz instance

const safe = new obj?.qux?.baz(); // undefined
const safe2 = new obj?.foo.bar.qux?.(); // undefined

https://babeljs.io/docs/en/babel-plugin-proposal-optional-chaining

https://github.com/tc39/proposal-optional-chaining


4

jsonObject.keyවටිනාකමට ප්‍රවේශ වීම සඳහා ඔබට සින්ටැක්ස් භාවිතා කළ හැකිය . ඔබට අරාවකින් වටිනාකමක් ලබා ගැනීමට අවශ්‍ය නම්, ඔබට සින්ටැක්ස් භාවිතා කළ හැකිය jsonObjectArray[index].key.

ඔබට අදහස ලබා දීම සඳහා විවිධ අගයන් වෙත ප්‍රවේශ වීමට කේත උදාහරණ මෙන්න.

        var data = {
            code: 42,
            items: [{
                id: 1,
                name: 'foo'
            }, {
                id: 2,
                name: 'bar'
            }]
        };

        // if you want 'bar'
        console.log(data.items[1].name);

        // if you want array of item names
        console.log(data.items.map(x => x.name));

        // get the id of the item where name = 'bar'
        console.log(data.items.filter(x => (x.name == "bar") ? x.id : null)[0].id);


4

ගතික ප්‍රවේශය

පහත deep(data,key)ශ්‍රිතයේ දී, ඔබට අත්තනෝමතික keyනූල් භාවිතා කළ හැකිය - ඔබේ නඩුවේදී items[1].name(ඔබට [i]ඕනෑම මට්ටමකින් අරාව අංකනය භාවිතා කළ හැකිය ) - යතුර අවලංගු නම් නිර්වචනය නොකළ ප්‍රතිලාභයකි.


3

එය සරල පැහැදිලි කිරීමකි:

var data = {
    code: 42,
    items: [{
        id: 1,
        name: 'foo'
    }, {
        id: 2,
        name: 'bar'
    }]
};

/*
1. `data` is object contain `item` object*/
console.log(data);

/*
2. `item` object contain array of two objects as elements*/
console.log(data.items);

/*
3. you need 2nd element of array - the `1` from `[0, 1]`*/
console.log(data.items[1]);

/*
4. and you need value of `name` property of 2nd object-element of array)*/
console.log(data.items[1].name);


2

jQuery හි grep ශ්‍රිතය මඟින් අරාව හරහා පෙරීමට ඔබට ඉඩ දෙයි:

var data = {
    code: 42,
    items: [{
        id: 1,
        name: 'foo'
    }, {
        id: 2,
        name: 'bar'
    }]
};

$.grep(data.items, function(item) {
    if (item.id === 2) {
        console.log(item.id); //console id of item
        console.log(item.name); //console name of item
        console.log(item); //console item object
        return item; //returns item object
    }

});
// Object {id: 2, name: "bar"}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


2
// const path = 'info.value[0].item'
// const obj = { info: { value: [ { item: 'it works!' } ], randominfo: 3 }  }
// getValue(path, obj)

export const getValue = ( path , obj) => {
  const newPath = path.replace(/\]/g, "")
  const arrayPath = newPath.split(/[\[\.]+/) || newPath;

  const final = arrayPath.reduce( (obj, k) => obj ?  obj[k] : obj, obj)
  return final;
}

1

අත්තනෝමතික JSON ගස් නිරාවරණය කිරීම සඳහා පයිතොනික්, පුනරාවර්තන හා ක්‍රියාකාරී ප්‍රවේශයක්:

handlers = {
    list:  iterate,
    dict:  delve,
    str:   emit_li,
    float: emit_li,
}

def emit_li(stuff, strong=False):
    emission = '<li><strong>%s</strong></li>' if strong else '<li>%s</li>'
    print(emission % stuff)

def iterate(a_list):
    print('<ul>')
    map(unravel, a_list)
    print('</ul>')

def delve(a_dict):
    print('<ul>')
    for key, value in a_dict.items():
        emit_li(key, strong=True)
        unravel(value)
    print('</ul>')

def unravel(structure):
    h = handlers[type(structure)]
    return h(structure)

unravel(data)

එහිදී දත්ත උත්කර්ෂවත් ලැයිස්තුව (අ JSON පෙළ වැල සිට කියවූ) වේ:

data = [
    {'data': {'customKey1': 'customValue1',
           'customKey2': {'customSubKey1': {'customSubSubKey1': 'keyvalue'}}},
  'geometry': {'location': {'lat': 37.3860517, 'lng': -122.0838511},
               'viewport': {'northeast': {'lat': 37.4508789,
                                          'lng': -122.0446721},
                            'southwest': {'lat': 37.3567599,
                                          'lng': -122.1178619}}},
  'name': 'Mountain View',
  'scope': 'GOOGLE',
  'types': ['locality', 'political']}
]

6
මෙම ප්‍රශ්නය ජාවාස්ක්‍රිප්ට් ගැන මිස පයිතන් ගැන නොවේ. පයිතන් සඳහා සමාන ප්‍රශ්නයක් තිබේදැයි විශ්වාස නැත.
ෆීලික්ස් ක්ලින්ග්


-4

මගේ stringdataපැමිණෙන්නේ PHP ගොනුවෙන් නමුත් තවමත්, මම මෙහි දක්වමි var. මම කෙලින්ම මගේ json objඑක එයට ගෙන ගිය විට කිසිවක් පෙන්වන්නේ නැත

var obj=JSON.parse(stringdata); ඒ නිසා මම messageobj ලබාගෙන අනතුරු ඇඟවීමේ කොටුවෙහි පෙන්වමි. එවිට මට ලැබෙන්නේ datajson අරාව සහ එක් විචල්‍යයක ගබඩා කිරීමයි, ArrObjඑවිට මම එම අරාවෙහි පළමු වස්තුව කියවන්නේ මේ හා සමාන වටිනාකමක් ඇතිවයArrObj[0].id

     var stringdata={
        "success": true,
        "message": "working",
        "data": [{
                  "id": 1,
                  "name": "foo"
         }]
      };

                var obj=JSON.parse(stringdata);
                var key = "message";
                alert(obj[key]);
                var keyobj = "data";
                var ArrObj =obj[keyobj];

                alert(ArrObj[0].id);

2
stringjsonනූලක් නොවන නිසා උදාහරණය අවුල් සහගතය .
ෆීලික්ස් ක්ලින්ග්
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.