जावास्क्रिप्ट में कुंजी-मूल्य जोड़े के एक वस्तु {} को एक सरणी [] में कैसे परिवर्तित करें


243

मैं एक वस्तु को इस तरह बदलना चाहता हूं:

{"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}

इस तरह की-वैल्यू जोड़े की एक सरणी में:

[[1,5],[2,7],[3,0],[4,0]...].

मैं एक ऑब्जेक्ट को जावास्क्रिप्ट में कुंजी-मूल्य जोड़े के एक सरणी में कैसे बदल सकता हूं?

जवाबों:


428

आप उपयोग कर सकते हैं Object.keys()और map()यह करने के लिए

var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var result = Object.keys(obj).map(function(key) {
  return [Number(key), obj[key]];
});

console.log(result);


6
@blvckasvp क्या आप अपनी कुंजी के रूप में संख्याओं का उपयोग कर रहे हैं? यदि नहीं, तो जब यह आपकी कुंजी को एक संख्या में बदलने की कोशिश करता है तो यह विफल हो जाएगा और NaNइसके बजाय वापस आ जाएगा। यदि आप स्ट्रिंग्स को अपनी कुंजी के रूप में उपयोग करना चाहते हैं, तो उनके उत्तर में दिए गए @Pila के अनुसार रिटर्न को बदल [Number(key), obj[key]]दें [key, obj[key]]या Object.entries@Pila का उपयोग करें
scottbot95

123

सबसे अच्छा तरीका है:

var obj ={"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10"‌​:0,"11":0,"12":0} 
Object.entries(obj);

कॉलिंग entries, जैसा कि यहां दिखाया गया है, [key, value]जोड़े वापस आ जाएंगे , जैसा कि पूछने वाले ने अनुरोध किया था।

वैकल्पिक रूप से, आप कॉल कर सकते हैं Object.values(obj), जो केवल मान लौटाएगा।


6
प्रिय डेवलपर्स, कृपया इन अच्छे कार्यों को अपनाने से पहले ECMA संगतता तालिका देखें, जो केवल कुछ मिनट पहले जारी किए गए ब्राउज़रों के अनुकूल हैं।
andreszs

8
@andreszs क्या मैं टेबल का उपयोग कर सकता हूं , यदि आपको IE समर्थन छोड़ने में कोई आपत्ति नहीं है (और 2019 में, मैं आपकी पवित्रता के लिए आशा करता हूं कि आप वास्तव में नहीं हैं) तो आप जाने के लिए बहुत अच्छे हैं। एफएफ 47 जून 2016 से है और क्रोम 54 उसी वर्ष, अक्टूबर 14 अगस्त से है। ठीक मिनट पहले नहीं।
क्युल

FYI करें: Object.entries वापस आएगी [key, value], लेकिन key एक string होगी, value अलग होगी।
SHAHBAZ

62

Object.entries()एक ऐसा ऐरे लौटाता है जिसके तत्व एनेमरबल प्रॉपर्टी [key, value]पेयर से मिलते- जुलते हैं object। गुणों का क्रम वही है जो वस्तु के गुण मानों पर मैन्युअल रूप से लूप करके दिया जाता है।

- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Description

Object.entriesसमारोह रिटर्न लगभग सटीक उत्पादन आप के लिए पूछ रहे हैं, कुंजी को छोड़कर संख्या के बजाय तार कर रहे हैं।

const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};

console.log(Object.entries(obj));

यदि आपको संख्याओं की कुंजी की आवश्यकता है, तो आप कॉलबैक फ़ंक्शन के साथ परिणाम को एक नए सरणी में मैप कर सकते हैं जो प्रत्येक जोड़ी में कुंजी को प्रतिस्थापित करता है, जिसमें से संख्या के साथ मिलकर।

const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};

const toNumericPairs = input => {
    const entries = Object.entries(input);
    return entries.map(entry => Object.assign(entry, { 0: +entry[0] }));
}

console.log(toNumericPairs(obj));

मैं एक एरो फ़ंक्शन का उपयोग करता हूं और Object.assignऊपर दिए गए उदाहरण में मैप कॉलबैक के लिए ताकि मैं इस तथ्य को एकतरफा रख कर उस तथ्य को प्राप्त कर Object.assignसकूं जो ऑब्जेक्ट को सौंपा जा रहा है, और एक इंस्ट्रक्शन एरो फ़ंक्शन का रिटर्न वैल्यू निर्देश का परिणाम है।

यह इसके बराबर है:

entry => {
    entry[0] = +entry[0];
    return entry;
}

जैसा कि टिप्पणियों में @TravisClarke द्वारा उल्लेख किया गया है, मैप फ़ंक्शन को छोटा किया जा सकता है:

entry => [ +entry[0], entry[1] ]

हालाँकि, जो मौजूदा सरणी को संशोधित करने के बजाय प्रत्येक कुंजी-मान जोड़ी के लिए एक नया सरणी बनाएगा, इसलिए बनाए गए कुंजी-मूल्य जोड़ी सरणियों की मात्रा को दोगुना कर देगा। हालांकि मूल प्रविष्टियाँ सरणी अभी भी सुलभ हैं, यह और इसकी प्रविष्टियाँ कचरा एकत्र नहीं की जाएंगी।

अब, भले ही हमारे इन-प्लेस पद्धति का उपयोग करते हुए अभी भी दो सरणियों का उपयोग किया जाता है जो कुंजी-मूल्य जोड़े (इनपुट और आउटपुट सरणियों) को पकड़ते हैं, सरणियों की कुल संख्या केवल एक द्वारा बदल जाती है। इनपुट और आउटपुट सरणियाँ वास्तव में सरणियों से भरी नहीं होती हैं, बल्कि सरणियों के संदर्भ में होती हैं और वे संदर्भ स्मृति में एक नगण्य मात्रा में जगह ले लेते हैं।

  • प्रत्येक कुंजी-मान जोड़ी को संशोधित करके मेमोरी वृद्धि की नगण्य मात्रा में परिणाम किया जाता है, लेकिन इसके लिए कुछ और वर्ण टाइप करने की आवश्यकता होती है।
  • प्रत्येक कुंजी-मान जोड़ी के लिए एक नई सरणी बनाने से आवश्यक मात्रा में मेमोरी दोगुनी हो जाती है, लेकिन कुछ कम वर्ण लिखने की आवश्यकता होती है।

आप एक कदम आगे जा सकते हैं और प्रविष्टियों की जगह को एक नए सरणी में मैप करने के बजाय प्रवेश सरणी को संशोधित करके विकास को पूरी तरह से समाप्त कर सकते हैं:

const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};

const toNumericPairs = input => {
  const entries = Object.entries(obj);
  entries.forEach(entry => entry[0] = +entry[0]);
  return entries;
}

console.log(toNumericPairs(obj));


1
मुझे कार्यात्मक दृष्टिकोण पसंद है। एक छोटे विकल्प के रूप में:Object.entries(obj).map(e => [+e[0], e[1]]);
ट्रैविस क्लार्क

21

2018 को अब इनमें से कुछ उत्तरों को फिर से तैयार करना है, जहां ईएस 6 मानक है।

वस्तु से शुरू:

let const={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
  • केवल एक सरणी पर मानों को आँख बंद करके प्राप्त करना, कुंजियों की परवाह न करना:

const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.values(obj));
//[9,8,7,6,5,4,3,2,1,0,5]

  • एक सरणी पर जोड़े को प्राप्त करना सरल है:

const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj));
//[["1",9],["2",8],["3",7],["4",6],["5",5],["6",4],["7",3],["8",2],["9",1],["10",0],["12",5]]

  • पिछले के समान, लेकिन प्रत्येक जोड़ी पर संख्यात्मक कुंजियों के साथ:

const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj).map(([k,v])=>[+k,v]));
//[[1,9],[2,8],[3,7],[4,6],[5,5],[6,4],[7,3],[8,2],[9,1],[10,0],[12,5]]

  • नए ऐरे के लिए ऑब्जेक्ट प्रॉपर्टी को कुंजी के रूप में उपयोग करना (विरल सरणियाँ बना सकता है):

const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj).reduce((ini,[k,v])=>(ini[k]=v,ini),[]));
//[undefined,9,8,7,6,5,4,3,2,1,0,undefined,5]

यह अंतिम विधि, यह कुंजी के मूल्य के आधार पर सरणी क्रम को भी पुनर्गठित कर सकती है। कभी-कभी यह वांछित व्यवहार हो सकता है (कभी-कभी नहीं)। लेकिन अब लाभ यह है कि मूल्यों को सही सरणी स्लॉट पर अनुक्रमित किया जाता है, इस पर खोज करने के लिए आवश्यक और तुच्छ।

  • ऐरे के बजाय नक्शा

अंत में (मूल प्रश्न का हिस्सा नहीं है, लेकिन पूर्णता के लिए), यदि आपको कुंजी या मान का उपयोग करके आसान खोज करने की आवश्यकता है, लेकिन आप स्प्रेड एरेस नहीं चाहते हैं, तो कोई डुप्लिकेट नहीं है और संख्यात्मक कुंजियों में बदलने की आवश्यकता के बिना कोई पुन: क्रमबद्ध नहीं है ( यहां तक ​​कि बहुत जटिल कुंजियों तक पहुंच सकते हैं), फिर सरणी (या ऑब्जेक्ट) वह नहीं है जो आपको चाहिए। मैं Mapइसके बजाय सिफारिश करेंगे :

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

let r=new Map(Object.entries(obj));
r.get("4"); //6
r.has(8); //true

2
चौथा बुलेट पॉइंट और उसके बाद का सवाल पूरी तरह से अप्रासंगिक है, और आपका बाकी का जवाब सिर्फ शीर्ष शीर्ष सवालों का सारांश प्रस्तुत कर रहा है। यह जवाब चर्चा में कुछ भी नहीं लाता है जो पहले से ही यहां नहीं था या पूरी तरह अप्रासंगिक नहीं है।

हां, पहली पंक्ति की स्थिति के रूप में, यह उत्तरों का सारांश है, फिर उन्हें पूर्ण झटका कार्यों के बजाय आधुनिक ES6 तकनीकों का उपयोग करने के लिए अपडेट करें। चौथा उत्तर उपयोगी है जब आप JSON सरणियों को एक भाषा से ले जा रहे हैं जो सहयोगी सरणियों (जैसे PHP) का समर्थन करता है।
कार्लोस

यहां प्रदान की गई सभी विधियां पहले से ही शीर्ष तीन उत्तरों में से दो में उनके सादे रूप में प्रदान की गई हैं, वे कार्यों में नहीं हैं इसलिए मुझे नहीं पता कि आप वहां क्या कर रहे हैं। जहां तक ​​4 था, जैसा कि मैंने कहा कि यह पूछे गए सवाल से पूरी तरह अप्रासंगिक है। यह एक अलग प्रश्न के लिए प्रासंगिक हो सकता है, लेकिन यह नहीं। इसके बावजूद, JSON JSON है चाहे वह PHP, जावास्क्रिप्ट, या हास्केल का उपयोग करके बनाई गई हो।

18

अगर Object.entriesआप के लिए काम नहीं करेगा अभी तक एक और समाधान ।

const obj = {
      '1': 29,
      '2': 42
    };
const arr = Array.from(Object.keys(obj), k=>[`${k}`, obj[k]]);
console.log(arr);


1
इसने मेरे लिए काम किया। मुझे एक समस्या का अनुभव हुआ जहाँ JSON के आयात में अनुक्रमणिका को जोड़ा गया जिससे Angulars ngFor लूप का उपयोग करना असंभव हो गया। इसने संरचना को संरक्षित करते हुए सूचकांक को हटा दिया।
RAC

"सूचकांक" के बजाय "इंडेक्स" का उपयोग करने के लिए @ आरएसी +1। बेगोन, पुरातन (यानी। मनमाना और अर्थहीन विचलन) अंग्रेजी परंपराएं!
वेनरिक्स

12

एक्मास्क्रिप्ट 6 में,

var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};

var res = Object.entries(obj);

console.log(res);

बेला


यकीन नहीं हो रहा था कि यह
नीचा दिखाया

1
मैंने डाउनवोट नहीं किया, लेकिन ध्यान दें कि यह .map((value)=>(value))हिस्सा अर्थहीन है - यह Object.entries(obj)कॉल से प्राप्त एक के बराबर एक प्रविष्टि-सरणी देता है ।
वेनेरीक्स Ven ’

8

उपयोग Object.keysऔर Array#mapतरीके।

var obj = {
  "1": 5,
  "2": 7,
  "3": 0,
  "4": 0,
  "5": 0,
  "6": 0,
  "7": 0,
  "8": 0,
  "9": 0,
  "10": 0,
  "11": 0,
  "12": 0
};
// get all object property names
var res = Object.keys(obj)
  // iterate over them and generate the array
  .map(function(k) {
    // generate the array element 
    return [+k, obj[k]];
  });

console.log(res);


7

प्रारूप Object.entriesमें ऑब्जेक्ट के प्रत्येक तत्व को प्राप्त करने के लिए उपयोग करें key & value, फिर mapउनके माध्यम से इस तरह:

var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}

var res = Object.entries(obj).map(([k, v]) => ([Number(k), v]));

console.log(res);

लेकिन, यदि आप निश्चित हैं कि चाबियां प्रगतिशील क्रम में होंगी, जिनका आप उपयोग कर सकते हैं Object.valuesऔर Array#mapकुछ ऐसा कर सकते हैं :

var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}; 

                        // idx is the index, you can use any logic to increment it (starts from 0)
let result = Object.values(obj).map((e, idx) => ([++idx, e]));

console.log(result);



5

लॉश के साथ, ऊपर दिए गए उत्तर के अलावा, आप आउटपुट ऐरे में भी कुंजी रख सकते हैं।

आउटपुट ऐरे में ऑब्जेक्ट कुंजियों के बिना

के लिये:

const array = _.values(obj);

यदि obj निम्नलिखित है:

{ art”: { id: 1,  title: aaaa }, fiction”: { id: 22,  title: 7777”} }

फिर सरणी होगी:

[ { id: 1, title: aaaa }, { id: 22, title: 7777 } ]

आउटपुट एरे में ऑब्जेक्ट कीज़ के साथ

यदि आप इसके बजाय लिखते हैं ('शैली' एक स्ट्रिंग है जिसे आप चुनते हैं):

const array= _.map(obj, (val, id) => {
    return { ...val, genre: key };
  });

तुम्हे मिल जाएगा:

[ 
  { id: 1, title: aaaa , genre: art”}, 
  { id: 22, title: 7777”, genre: fiction }
]


1

आप उपयोग कर सकते हैं Object.values([]), अगर आप पहले से ही नहीं हैं तो आपको इस पॉलीफिल की आवश्यकता हो सकती है:

const objectToValuesPolyfill = (object) => {
  return Object.keys(object).map(key => object[key]);
};
Object.values = Object.values || objectToValuesPolyfill;

https://stackoverflow.com/a/54822153/846348

तो आप बस कर सकते हैं:

var object = {1: 'hello', 2: 'world'};
var array = Object.values(object);

बस याद रखें कि js में सरणियाँ केवल संख्यात्मक कुंजियों का उपयोग कर सकती हैं इसलिए यदि आप ऑब्जेक्ट में कुछ और इस्तेमाल करते हैं तो वे `0,1,2 ... x`` बन जाएंगे।

यदि आपके पास एक अद्वितीय कुंजी है, तो उदाहरण के लिए डुप्लिकेट को हटाने के लिए यह उपयोगी हो सकता है।

var obj = {};
object[uniqueKey] = '...';

0

उपयोग में लिए

var obj = { "10":5, "2":7, "3":0, "4":0, "5":0, "6":0, "7":0,
            "8":0, "9":0, "10":0, "11":0, "12":0 };

var objectToArray = function(obj) {
    var _arr = [];

    for (var key in obj) {
        _arr.push([key, obj[key]]);
    }
    return _arr;
}

console.log(objectToArray(obj));

0

पुनरावर्ती ऑब्जेक्ट को सरणी में बदलें

function is_object(mixed_var) {
    if (mixed_var instanceof Array) {
        return false;
    } else {
        return (mixed_var !== null) && (typeof( mixed_var ) == 'object');
    }
}


function objectToArray(obj) {
    var array = [], tempObject;
    for (var key in obj) {

        tempObject = obj[key];

        if (is_object(obj[key])) {
            tempObject = objectToArray(obj[key]);
        }
        array[key] = tempObject;
    }
    return array;
}

0

हम नीचे की तरह कुंजी के लिए संख्या को स्ट्रिंग प्रकार में बदल सकते हैं:

var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var result = Object.keys(obj).map(function(key) {
  return [String(key), obj[key]];
});
    
console.log(result);


0

यह मेरा समाधान है, मेरे पास एक ही मुद्दा है और इसकी तरह यह समाधान मेरे लिए काम करता है।

yourObj = [].concat(yourObj);

0

यह मेरा सरल नंगेपन का कार्यान्वयन है:

let obj = {
  "1": 5,
  "2": 7,
  "3": 0,
  "4": 0,
  "5": 0,
  "6": 0,
  "7": 0,
  "8": 0,
  "9": 0,
  "10": 0,
  "11": 0,
  "12": 0
};    

const objectToArray = obj => {
      let sol = [];
      for (key in obj) {
        sol.push([key, obj[key]]);
      }
      return sol;
    };

objectToArray(obj)


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.