मैं एक सरणी से एक नई सरणी बनाने की कोशिश कर रहा हूं जो कुंजी द्वारा समूह होगा और नई सरणी की अनुक्रमणिका पुरानी सरणी की कुंजी होगी, ऐसा कुछ

पुरानी सरणी

Array1
0 :term_id: "1"
   capacity:"11"
   price: "452"
1 :term_id: "2"
   capacity:"33"
   price: "44"
2 :term_id: "1"
   capacity:"1"
   price: "2"

मैं इस सरणी को term_id द्वारा समूहित करना चाहता हूं, इसलिए नई सरणी है

नई सरणी

Array2
1 :terms >
   0: capacity:"11"
      price: "452"
   1: capacity:"1"
      price: "2"
2 :terms >
  0:  capacity:"33"
      price: "44"

जैसा कि आप देख सकते हैं, नई सरणी में सरणी को टर्म_आईडी के सूचकांक द्वारा समूहीकृत किया गया है और इसकी सामग्री के साथ एक और सरणी है

मैंने groupBy विधि का उपयोग करने की कोशिश की, लेकिन मैं पुराने सरणी की अनुक्रमणिका को संरक्षित करने में असमर्थ हूं

0
Dhiraj 29 मार्च 2018, 17:22

5 जवाब

सबसे बढ़िया उत्तर

आप वांछित आउटपुट को समूहबद्ध करने और बनाने के लिए reduce फ़ंक्शन का उपयोग कर सकते हैं।

var Array1 = [{  term_id: "1",  capacity: "11",  price: "452"}, {  term_id: "2",  capacity: "33",  price: "44"}, {  term_id: "1",  capacity: "1",  price: "2"}];

var result = Object.values(Array1.reduce((a, {term_id, capacity, price}) => {
  (a[term_id] || (a[term_id] = {terms: []})).terms.push({capacity, price});
  return a;
}, {}));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Ele 29 मार्च 2018, 14:29

समूहीकरण के लिए बस हैशटेबल का उपयोग करें:

 const result = [], hash = {};

 for(const obj of array) {
   if(hash[obj.term_id]) {
     hash[obj.term_id].push(obj);
   } else {
     result.push(hash[obj.term_id] = [obj]);
   }
 }
0
Jonas Wilms 29 मार्च 2018, 15:55

यदि आप लूप का उपयोग करना चाहते हैं ... परिणाम में सभी डेटा की प्रतिलिपि बनाना स्मृति की बर्बादी है, मुझे लगता है कि आपको आवश्यक डेटा उत्पन्न करने और पहले से मौजूद किसी भी मान को रखने के लिए यह एक बेहतर अभ्यास है, लेकिन वह लाइन के नीचे बदसूरत कोड का कारण बन सकता है -_-

function idxOfGroupBy(hl,key){
let ret = [];
for(var k = 0; k < hl.length; k++){
	try{
		ret[hl[k][key]].push(k);
	}catch(err){
		ret[hl[k][key]] = [];
		ret[hl[k][key]].push(k);
	}
}
return(ret);
}

let hashList = [{at1:"1",atr2:"."},{at1:"2",atr2:".."},{at1:"1",atr2:"..."}];
let groupIdxs = idxOfGroupBy(hashList,"at1");
console.log(groupIdxs);
0
kpie 29 मार्च 2018, 14:56

आप Array.prototype के reduce का उपयोग कर सकते हैं

x = [{term_id:"1",capacity:"11",price:"452"},{term_id:"2",capacity:"33",price:"44"},{term_id:"1",capacity:"1",price:"2"}];

y = x.reduce((n, e) => {
            var clone = Object.assign({}, e);  //creating duplicate object
            delete clone.term_id;              //deleteing term_id property from clone object
            if (!n[e.term_id]) {
                n[e.term_id] = [];
            }
            n[e.term_id].push(clone);    //pushing clone instead of e as e contains term_id which we don't need in result
            return n;
        }, {});
   
console.log(y);
1
yajiv 29 मार्च 2018, 17:31

आप किसी ऑब्जेक्ट में term_id के आधार पर अपने ऑब्जेक्ट ऐरे को समूहित करने के लिए array#reduce का उपयोग कर सकते हैं, फिर Object.values() का उपयोग करके सभी मान प्राप्त कर सकते हैं।

var data = [{ term_id: "1", capacity: "11", price: "452" }, { term_id: "2", capacity: "33", price: "44" }, { term_id: "1", capacity: "1", price: "2" }],
    result = Object.values(data.reduce((r,{term_id, capacity, price})=> {
      r[term_id] = r[term_id] || [];
      r[term_id].push({capacity, price});
      return r;
    },{}));
console.log(result);
1
Hassan Imam 29 मार्च 2018, 14:29