JQuery का उपयोग करके सरणी के लिए एक जेएस वस्तु परिवर्तित


417

मेरा आवेदन निम्नलिखित की तरह एक जावास्क्रिप्ट ऑब्जेक्ट बनाता है:

myObj= {1:[Array-Data], 2:[Array-Data]}

लेकिन मुझे एक सरणी के रूप में इस ऑब्जेक्ट की आवश्यकता है।

array[1]:[Array-Data]
array[2]:[Array-Data]

इसलिए मैंने इस ऑब्जेक्ट को ऑब्जेक्ट के $.eachमाध्यम से पुनरावृत्ति करके और एरे को एलीमेंट में जोड़कर एक ऐरे में बदलने की कोशिश की :

x=[]
$.each(myObj, function(i,n) {
    x.push(n);});

किसी वस्तु को किसी सरणी या शायद किसी फ़ंक्शन में बदलने का एक बेहतर तरीका है?


1
क्या सरणी सूचकांकों को मूल वस्तु में कुंजियों के समान होना चाहिए? किसी सरणी में पहला सूचकांक हमेशा 0 होता है, लेकिन आपका अपना कोड और अधिकांश उत्तर (स्वीकृत एक सहित) इसे अनदेखा करते हैं; फिर भी, आपने मेरे संपादन को वांछित उदाहरण परिणाम पर वापस ला दिया है।
इमरज

1
हाँ, तुम ठीक कह रहे: 0. के साथ पहली सरणी तत्व शुरू होता है लेकिन मैं अपने संपादित को वापस लाया गया है, क्योंकि यह संभव के रूप में है कि उदाहरण के सरल रखने के लिए मेरी आँखों में अनुरूप नहीं था, क्योंकि बदलते myObj= {1:[Array-Data]करने के लिए myObj= {0:[Array-Data]अपने संपादित का हिस्सा नहीं था (जैसा कि मैं सही याद)
बंड्र

3
उस api.jquery.com/jQuery.makeArray के लिए jQuery $ .makeArray (obj) कमांड का उपयोग करें
DevlshOne

@DevlshOne प्रलेखन यू प्रदान करता है कहते हैं: "एक jQuery वस्तु एक सरणी में बदल दें" मुझे नहीं लगता कि यह ओपी प्रश्न पर फिट बैठता है
एलेक्स

जवाबों:


429
var myObj = {
    1: [1, 2, 3],
    2: [4, 5, 6]
};

var array = $.map(myObj, function(value, index) {
    return [value];
});


console.log(array);

आउटपुट:

[[1, 2, 3], [4, 5, 6]]

8
@ डोग्बर्ट, क्या आप बता सकते हैं $.map? हर खोज जो मैं इस पर करने की कोशिश करता हूं वह सिर्फ jQuery के बहुत सारे लिंक या सरणियों के मानचित्र विधि को बदल देती है।
15

21
डी 'ओह! मेरी टिप्पणी पर ध्यान न दें। मैंने इस प्रश्न पर jQuery टैग पर ध्यान नहीं दिया था।
क्रान्तोक

8
क्या नए एरे में कुंजियों को बनाए रखने का कोई तरीका है? www पर हर जवाब मैं देख कुंजी के रूपांतरण का अभाव है।
TD_Nijboer

55
आप इसे jQuery के बिना भी कर सकते हैं: Object.keys (myObject) .map (फंक्शन (वैल) {रिटर्न [वैल्यू}});
क्रिश एरिकसन 19

3
@TD_Nijboer हाँ, value.key = index; return [value];इसके बजाय का उपयोग करेंreturn [value];
शमौन अर्नोल्ड

742

यदि आप एक कार्यात्मक दृष्टिकोण की तलाश कर रहे हैं:

var obj = {1: 11, 2: 22};
var arr = Object.keys(obj).map(function (key) { return obj[key]; });

का परिणाम:

[11, 22]

एक ES6 तीर फ़ंक्शन के साथ ही:

Object.keys(obj).map(key => obj[key])

ES7 के साथ आप Object.valuesइसके बजाय ( अधिक जानकारी ) का उपयोग करने में सक्षम होंगे :

var arr = Object.values(obj);

या यदि आप पहले से ही अंडरस्कोर / लो-डैश का उपयोग कर रहे हैं:

var arr = _.values(obj)


3
शीर्ष उत्तर से असंतुष्ट, मैंने बस यह लगभग सटीक फ़ंक्शन लिखा था, इसे एक उत्तर के रूप में पोस्ट करने के लिए वापस आया, नीचे स्क्रॉल किया, 170 देखा। एहसास हुआ, अगर मैंने हार नहीं मानी होती तो मुझे सोचना नहीं पड़ता था :) यह सबसे ऊपर होना चाहिए। OP pls उत्तर के रूप में चुनें।
j03m

1
जिस किसी के लिए भी यह स्पष्ट नहीं है, चाबियाँ अनुक्रमिक होने की आवश्यकता नहीं है (अर्थात इस उदाहरण में वे 1 और 2 हैं - लेकिन वे बस एक स्ट्रिंग कुंजी या गैर अनुक्रमिक संख्या हो सकती हैं
सिमोन_वेअर

कोड के पहले पैराग्राफ के लिए मुझे सेमी-कोलोन गायब है। यकीन नहीं है कि क्यों।
जॉनीबिजल

@ जॉननीज़ मुझे लगता है कि आपके लिंटर को "रिटर्न ओब्ज [कुंजी];" अंत में एक अर्धविराम के साथ। जावास्क्रिप्ट हालांकि नहीं है।
जोएल रिचर्ड

30

मुझे लगता है कि आप उपयोग कर सकते हैं, for inलेकिन जाँच कर सकते हैं कि संपत्ति में आय नहीं है

myObj= {1:[Array-Data], 2:[Array-Data]}
var arr =[];
for( var i in myObj ) {
    if (myObj.hasOwnProperty(i)){
       arr.push(myObj[i]);
    }
}

EDIT - यदि आप चाहते हैं कि आप अपनी वस्तु के अनुक्रमित को भी रख सकें, लेकिन आपको यह देखना होगा कि क्या वे संख्यात्मक हैं (और आपको अनुपलब्ध अनुक्रमों के लिए अपरिभाषित मान प्राप्त होते हैं:

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

myObj= {1:[1,2], 2:[3,4]}
var arr =[];
for( var i in myObj ) {
    if (myObj.hasOwnProperty(i)){
        if (isNumber(i)){
            arr[i] = myObj[i];
        }else{
          arr.push(myObj[i]);
        }
    }
}

1
आपको कोड का परीक्षण करना चाहिए था। $.mapचपटा हो जाएगा Array-Data
मार्को ड्युमिक

तुम सही हो मैं यह एक सरणी के साथ परीक्षण नहीं किया और नक्शा यह समतल करता है! मैंने जवाब को संशोधित किया
निकोला पेलुचेती

@ नोइकोला पेलुचेती $ .makeArray () अच्छा लगता है, लेकिन वह नहीं है जिसकी मुझे तलाश थी, क्योंकि यह ऑब्जेक्ट को एक एलीमेंट तत्व में रखता है: [{1:[Array-Data], 2:[Array-Data]}]और $.map()यह भी सफल नहीं दिखता। यह सीम, कि सभी उप-सरणी डेटा को एक सरणी में विलय कर दिया गया है। array.length2 लौट जाना चाहिए (क्योंकि 2 तत्व मौजूद हैं), लेकिन यह 67 को लौटाता है जो सभी ["एरे-डेटा"] में सभी तत्वों की संख्या है।
बंड्र

@ Bndr i ने एक और समाधान पोस्ट किया, लेकिन आप
डॉगबर्ट

मुझे लगता है कि आपको स्पष्ट रूप से सरणी सूचकांक को निर्दिष्ट करना होगा ... जैसे arr[+i] = myObj[i];कि (i) for(...in...)किसी भी क्रम में गुणों को वापस करने की गारंटी नहीं है (ii) ओपी के उदाहरण में गुण 1 से शुरू होते हैं, 0. नहीं
सलमान ए


25

यदि आपको पता है कि आप में अधिकतम इंडेक्स है तो आप निम्नलिखित कार्य कर सकते हैं:

var myObj = {
    1: ['c', 'd'],
    2: ['a', 'b']
  },
  myArr;

myObj.length = 3; //max index + 1
myArr = Array.prototype.slice.apply(myObj);
console.log(myArr); //[undefined, ['c', 'd'], ['a', 'b']]


1
यह उस कोड के लिए कहीं बेहतर होगा जो वस्तु को उत्पन्न करने के लिए लंबाई भी निर्धारित करता है या वास्तव में इसे पहली जगह देता है। मुझे उम्मीद नहीं है कि या तो संभव है, इसलिए मेरे लिए यह उत्तर उपयोगी नहीं है।
user2000095- टिम

myObj.length = Object.keys(myObj).length
बेल्डर्स

19

चूंकि ES5 Object.keys () एक सरणी देता है जिसमें किसी ऑब्जेक्ट पर सीधे परिभाषित गुण होते हैं (प्रोटोटाइप श्रृंखला में परिभाषित गुणों को छोड़कर):

Object.keys(yourObject).map(function(key){ return yourObject[key] });

ES6 तीर कार्यों के साथ इसे एक कदम आगे ले जाता है:

Object.keys(yourObject).map(key => yourObject[key]);

1
वर्तमान ES5 के लिए (हालाँकि मुझे ES6 का आनंद मिलता है): Object.keys (yourObject) .map (फंक्शन (की)) {yourbbject लौटना [कुंजी]};
डेविड Zorychta

18

आजकल, ऐसा करने का एक सरल तरीका है: Object.values ​​()

var myObj = {
    1: [1, 2, 3],
    2: [4, 5, 6]
};

console.log(Object.values(myObj));

आउटपुट:

[[1, 2, 3], [4, 5, 6]]

इसके लिए jQuery की आवश्यकता नहीं है, इसे ECMAScript 2017 में परिभाषित किया गया है।
यह हर आधुनिक ब्राउज़र (IE को भूल गया) द्वारा समर्थित है।


अगर मैं ऐसा कुछ करता हूं var state = { ingredient: { salad: 1, bacon: 1, } }और फिर उसके var HariOm = Object.values(state);बाद console.log(typeof HariOM)यह ऑब्जेक्ट के रूप में प्रदर्शित होता है। क्या इसे इसे एक सरणी के रूप में प्रदर्शित नहीं करना चाहिए?
रोहितभटिया

यह पूरी तरह से सामान्य है, यहां संदर्भ देखें: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - आप उपयोग कर सकते हैंArray.isArray(HariOM)
Stopi

16

सबसे अच्छा तरीका एक जावास्क्रिप्ट -ऑनली फ़ंक्शन का उपयोग करना होगा:

var myArr = Array.prototype.slice.call(myObj, 0);

@Qwerty कौन सा ब्राउज़र?
टेस्ट 30

क्रोम। के साथ परीक्षण किया गयाvar myObj = {1:[1,2,3],2:[4,5,6]};
Qwerty

ध्यान दें कि यह विधि "सरणी जैसी वस्तुओं" को परिवर्तित करने के लिए काम करती है, जिसका अर्थ है कि उन्हें "लंबाई" संपत्ति मिली है और गणना किए गए गुण 0. से गिने जा रहे हैं, इसलिए @ क्वर्टी के उदाहरण काम करने के लिए यह प्रयास करें: {0: [1 , 2,3], 1: [4,5,6], लंबाई: 2}। सूचकांक मूल्यों और लंबाई मूल्यों के साथ प्रयोग, यह थोड़ा उदार है। यहाँ विषय पर एक अच्छा पढ़ा है: nfriedly.com/techblog/2009/06/… "एरे- लाइक ऑब्जेक्ट्स" को छोड़ें।
मैट

15
x = [];
for( var i in myObj ) {
    x[i] = myObj[i];
}

10
आपको पुश का उपयोग करना चाहिए, अन्यथा आप एक वस्तु का निर्माण कर सकते हैं
निकोला पेलुचेती

हो सकता है कि यह इंडेक्स को इंटिमेट करने के लिए कुछ बेहतर फोर्स हो। var bbb = {'1': 'a', '3': 'b'}; var x = []; for (var i in bbb) { x[parseInt(i)] = bbb[i];} console.log(x);
tres.14159





3

Fiddle Demo

Bjornd के उत्तर का विस्तार

var myObj = {
    1: [1, [2], 3],
    2: [4, 5, [6]]
}, count = 0,
    i;
//count the JavaScript object length supporting IE < 9 also
for (i in myObj) {
    if (myObj.hasOwnProperty(i)) {
        count++;
    }
}
//count = Object.keys(myObj).length;// but not support IE < 9
myObj.length = count + 1; //max index + 1
myArr = Array.prototype.slice.apply(myObj);
console.log(myArr);


संदर्भ

Array.prototype.slice ()

Function.prototype.apply ()

Object.prototype.hasOwnProperty ()

Object.keys ()


मैं गलत हो सकता हूं, लेकिन क्या myObj के लिए बेहतर होना चाहिए कि वह 0 पर शुरू होने वाला एक शानदार हो? इसके अलावा, मुझे ऐसा लगता है कि हमारे पास एक ऐसा मुद्दा है जहां हमारा ऐरे होगा: [अपरिभाषित, [1, [2], 3]] (पहला भाग अपरिभाषित है क्योंकि यह myObj नहीं पाता है [0]] और पिछले भाग myObj ['2'] को हटा दिया जा रहा है क्योंकि पढ़ने के बाद। यह myObj ['1'] पर बंद हो जाता है?
एलेक्स वर्नर

2

यदि आप ऑब्जेक्ट के गुणों का नाम मान के रूप में रखना चाहते हैं। उदाहरण:

var fields = {
    Name: { type: 'string', maxLength: 50 },
    Age: { type: 'number', minValue: 0 }
}

का उपयोग करें Object.keys(), Array.map()और Object.assign():

var columns = Object.keys( fields ).map( p => Object.assign( fields[p], {field:p} ) )

परिणाम:

[ { field: 'Name', type: 'string', maxLength: 50 }, 
  { field: 'Age', type: 'number', minValue: 0 } ]

स्पष्टीकरण:

Object.keys()स्रोत के सभी गुणों की गणना करता है; प्रत्येक प्रॉपर्टी .map()पर =>फ़ंक्शन लागू करता है और एक एरियर लौटाता है; Object.assign()प्रत्येक संपत्ति के लिए नाम और मूल्य को मर्ज करता है।


1

मैंने एक कस्टम फंक्शन बनाया:

    Object.prototype.toArray=function(){
    var arr=new Array();
    for( var i in this ) {
        if (this.hasOwnProperty(i)){
            arr.push(this[i]);
        }
    }
    return arr;
};

0

कुछ परीक्षणों के बाद, यहाँ सरणी फ़ंक्शन कनवर्टर के लिए एक सामान्य वस्तु है:

आपके पास वस्तु है:

var obj = {
    some_key_1: "some_value_1"
    some_key_2: "some_value_2"
};

कार्यक्रम:

function ObjectToArray(o)
{
    var k = Object.getOwnPropertyNames(o);
    var v = Object.values(o);

    var c = function(l)
    {
        this.k = [];
        this.v = [];
        this.length = l;
    };

    var r = new c(k.length);

    for (var i = 0; i < k.length; i++)
    {
        r.k[i] = k[i];
        r.v[i] = v[i];
    }

    return r;
}

समारोह का उपयोग करें:

var arr = ObjectToArray(obj);

आपको मिला:

arr {
    key: [
        "some_key_1",
        "some_key_2"
    ],
    value: [
        "some_value_1",
        "some_value_2"
    ],
    length: 2
}

तो फिर आप सभी कुंजी और मान तक पहुँच सकते हैं जैसे:

for (var i = 0; i < arr.length; i++)
{
    console.log(arr.key[i] + " = " + arr.value[i]);
}

कंसोल में परिणाम:

some_key_1 = some_value_1
some_key_2 = some_value_2

संपादित करें:

या प्रोटोटाइप रूप में:

Object.prototype.objectToArray = function()
{
    if (
        typeof this != 'object' ||
        typeof this.length != "undefined"
    ) {
        return false;
    }

    var k = Object.getOwnPropertyNames(this);
    var v = Object.values(this);

    var c = function(l)
    {
        this.k = [];
        this.v = [];
        this.length = l;
    };

    var r = new c(k.length);

    for (var i = 0; i < k.length; i++)
    {
        r.k[i] = k[i];
        r.v[i] = v[i];
    }

    return r;
};

और फिर उपयोग करें:

console.log(obj.objectToArray);

0

आप से रूपांतरण करने के लिए एक सरल समारोह बना सकते हैं objectकरने के लिए array, कुछ इस तरह आप शुद्ध जावास्क्रिप्ट का उपयोग करने के लिए काम कर सकते हैं:

var objectToArray = function(obj) {
  var arr = [];
  if ('object' !== typeof obj || 'undefined' === typeof obj || Array.isArray(obj)) {
    return obj;
  } else {
    Object.keys(obj).map(x=>arr.push(obj[x]));
  }
  return arr;
};

या यह एक:

var objectToArray = function(obj) {
  var arr =[];
  for(let o in obj) {
    if (obj.hasOwnProperty(o)) {
      arr.push(obj[o]);
    }
  }
  return arr;
};

और नीचे दिए गए फ़ंक्शन को कॉल और उपयोग करें:

var obj = {1:'a', 2:'b', 3:'c', 4:'d', 5:'e'};
objectToArray(obj); // return ["a", "b", "c", "d", "e"]

इसके अलावा, भविष्य में हमारे पास कुछ कहा जाएगा Object.values(obj), Object.keys(obj)जो एक सरणी के रूप में आपके लिए सभी संपत्तियों को लौटाएगा, लेकिन अभी तक कई ब्राउज़रों में समर्थित नहीं है ...

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