2016-09-14 15 views
5

मैं एक वस्तु (नहीं एक सरणी) lodash का उपयोग करने से पहले n कुंजी/मान जोड़े प्राप्त करना चाहते हैं। मैं this answer for underscore पाया है, जो उपयोग का उपयोग करने का कहना है पहले (lodash में मौजूद नहीं है), या ले (केवल सरणियों पर काम करता है) का उपयोग करें।lodash का उपयोग कर किसी ऑब्जेक्ट के पहले n तत्व कैसे प्राप्त करें?

नमूना नोड सत्र 'एक: 7' प्राप्त करने की कोशिश और 'बी: 8' एक वस्तु से जोड़े:

> var ld=require("lodash") 
undefined 
> var o={a:7, b:8, c:9} 
undefined 
> ld.keys(o) 
[ 'a', 'b', 'c' ] 
> ld.take(o, 2) 
[] 
> ld.first(o, 2) 
undefined 
> 

निश्चित रूप से, वहाँ lodash के साथ ऐसा करने के लिए कुछ आसान तरीका होना चाहिए, लेकिन के लिए मेरे जीवन में मुझे कुछ भी नहीं मिला। शायद मुझे देशी जेएस का सहारा लेना है?

+0

आपके अपेक्षित आउटपुट क्या है? [ए, बी]? –

+0

मैं मूल के सबसेट के साथ {ए: 7, बी: 8} - एक "हैश" (ऑब्जेक्ट) प्राप्त करने की अपेक्षा करता हूं। मैं इसे कम से कम एक (perl-like) हैश के रूप में इलाज कर रहा हूं। – vt5491

+4

कुछ ध्यान में रखें - किसी ऑब्जेक्ट में "पहली" कुंजी पूरी तरह से व्यर्थ है। ऑब्जेक्ट गुणों की कोई आवश्यक स्थिरता नहीं है, इसलिए "पहला तीन" (सिद्धांत में) किसी भी तीन हो सकता है। ब्राउज़र आमतौर पर सम्मिलन आदेश में गुण लौटाते हैं लेकिन उस व्यवहार पर भरोसा नहीं करते हैं। – vlaz

उत्तर

4

आप कस्टम कोड लिखने के बिना एक वस्तु के पहले एन तत्वों नहीं ले सकते। यह no ordering of the elements in objects है वहाँ क्योंकि, इसलिए यदि इसके लिए एक पुस्तकालय समारोह थे, तो यह आपको तत्वों आप उम्मीद कर देने के लिए गारंटी दी जा कभी नहीं होगा है।

var obj = { b: 3, y: 2, a: 1 }; 

यह स्पष्ट नहीं है की तरह एक वस्तु को देखते हुए क्या "पहले 2" को संदर्भित करता है - आप a और b चाहते हैं, क्योंकि कि वर्णमाला क्रम है? यदि ऐसा है तो वे उस क्रम में हैं या नहीं? यदि नहीं, तो क्या आप b और y चाहते हैं क्योंकि वे पहले दिखाई देते हैं? शायद आप a और y क्योंकि उनके मूल्यों सबसे कम होने का करना चाहते हैं?

डुप्लिकेट न मिलने से आपको क्या मिलेगा इसके लिए कोई गारंटी नहीं है, इसलिए उन सभी संयोजन मान्य हैं। इसके अलावा, आप उन्हें किसी भी क्रम में प्राप्त कर सकते हैं y और a समान रूप से मान्य आउटपुट है आप एक या दूसरे को प्राथमिकता दे सकते हैं लेकिन यह सामान्य रूप से इसे सही नहीं बनाता है।

इसके आसपास के तरीके हैं और आपको यह स्वीकार करना होगा कि आपको गैर-आदेश से निपटने की आवश्यकता है।

शुद्ध जावास्क्रिप्ट समाधान।

function firstN(obj, n) { 
 
    return Object.keys(obj) //get the keys out 
 
    .sort() //this will ensure consistent ordering of what you will get back. If you want something in non-aphabetical order, you will need to supply a custom sorting function 
 
    .slice(0, n) //get the first N 
 
    .reduce(function(memo, current) { //generate a new object out of them 
 
     memo[current] = obj[current] 
 
     return memo; 
 
    }, {}) 
 
} 
 
var obj = { b: 2, y: 25, a: 1 } 
 

 
console.log(firstN(obj, 2));

यह Object.keys, Array.prototype.sort, और Array.prototype.reduce

ही lodash साथ प्राप्त किया जा सकता है, लेकिन इस से काफी अधिक संक्षिप्त नहीं उपयोग कर रहा है - यह इसी तरह की सुविधा बुला शामिल होगा। यह इस तरह से किया जा सकता है, उदाहरण के लिए:

function firstN(obj, n) { 
 
    return _.chain(obj) 
 
    .keys() 
 
    .sort() 
 
    .take(n) 
 
    .reduce(function(memo, current) { 
 
     memo[current] = obj[current]; 
 
     return memo; 
 
    }, {}) 
 
    .value(); 
 
} 
 

 
var obj = { b: 2, y: 25, a: 1 } 
 
     
 
console.log(firstN(obj, 2));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

आप देख सकते हैं, यह काफी पहले की तरह ही है। सिंटैक्स पर भिन्नताएं हो सकती हैं और सटीक का अर्थ यह है कि आप यह कार्य कैसे करते हैं, लेकिन प्रमुख बिंदु अभी भी वहां होना चाहिए - आपको स्थिरता और के बाद क्रमबद्ध करने की आवश्यकता है, तो आप किसी भी आइटम को प्राप्त कर सकते हैं।

+0

को स्पष्ट करने के लिए धन्यवाद हाँ, मुझे यह पसंद है क्योंकि यह एक कार्यात्मक शैली में है। – vt5491

+0

फिर भी, मुझे लगता है कि मैं सीख रहा हूं कि lodash सरणी की ओर पक्षपातपूर्ण है। यद्यपि हैश में हैश होना ठीक है [{a: 1}, {b: 2}]। तो शायद अंतिम समाधान कंटेनर के रूप में हैश (ऑब्जेक्ट्स) का उपयोग करने से बचने के लिए है। लेकिन मैंने लॉनाश के 'ऑब्जेक्ट' सेक्शन को भी खोजा। * ToPairs * function: '> object = {a: 7, b: 8, c: 9} {a: 7, b: 8, c: 9} > _ खोजने के बाद मुझे इसके साथ कुछ शुभकामनाएं मिलीं। चेन (ऑब्जेक्ट) .toPairs (ओ)। टेक (2) .value() [['ए', 7], ['बी', 8]] – vt5491

+0

यह 'object = {a: 7, b: 8 है, सी: 9}; _.chain (ऑब्जेक्ट) .toPairs() ले लो (2) .value() ' रिटर्न: ' [['ए', 7], ['बी', 8]] ' – vt5491

3

आप first के लिए loadash प्रलेखन को देखें, तो। यह केवल एक तर्क में अपनी तर्क के रूप में लेता है, और शायद यह उपयोग करने के लिए एपीआई नहीं है।

देखें: https://lodash.com/docs/3.10.1#first


यहाँ 1 विधि आप मानक Javascript एपीआई का उपयोग कर इसे हल कर सकते है।

यहां पकड़ यह है कि आप Object.keys(...)[index] एपीआई का उपयोग अपनी स्थिति के आधार पर तत्व की कुंजी को पुनर्प्राप्त करने के लिए कर सकते हैं।

फिर तुम सब करने की जरूरत है तो बस पाश एक और वस्तु में उपयोग करते हुए समय की n संख्या और व्युत्पन्न कुंजी धक्का यह है।

var firstN = 2; 
 
var o={a:7, b:8, c:9}; 
 
var result = {}; 
 

 
for (var index=0; index < firstN; index++) { 
 
    var key = Object.keys(o)[index]; 
 
    result[key] = o[key]; 
 
} 
 

 
console.log(result);

+0

repsonse के लिए धन्यवाद। तो आपका मूल रूप से क्या कहना है कि लॉनाश ऐसा नहीं कर सकता है। लॉसैश का उपयोग करने का पूरा कारण मैं बॉयलरप्लेट लिखने से बचने और "कार्यात्मक रूप से" सोचने से बचाना चाहता हूं। लेकिन मैं वस्तुओं के आदेश के बारे में इस बात की सराहना करता हूं कि मैं आदेश नहीं दे रहा हूं। मैं आपकी प्रतिक्रिया को खारिज नहीं कर रहा हूं और मैं इसके लिए आभारी हूं, लेकिन मुझे लगता है कि यह निराशाजनक (और आश्चर्य की बात है) कि लॉलाश इस कार्यक्षमता को प्रदान नहीं करता है। जैसे मैंने कहा, यह आपको निर्देशित नहीं है, बस लॉनाश के बारे में एक सामान्य अवलोकन। अनुलेख मुझे अभी भी lodash पसंद है। – vt5491

+0

@ vt5491 - मुझे लगता है। आप अभी भी वह कर सकते हैं जो आप 'टेक' का उपयोग करना चाहते थे, मेरा अद्यतन उत्तर देखें। उम्मीद है कि किसी भी तरह से मदद करता है। –

+0

@ vt5491 - आपके लिए थोड़ा सा शोध किया और पाया कि इस लड़के के पास भी आपके जैसा ही मुद्दा था: पी https://github.com/lodash/lodash/issues/946 –

संबंधित मुद्दे