मेरे पास निम्न डेटा संरचना है, जिसे मैंने अनुभागों को उनके मूल स्तर से समूहित करने का प्रयास किया है।

  const arr = [
    {
      level: '1.1',
      name: 'group title 1',
    },
    {
      level: '1.1.1',
      name: 'group section 1.1.1',
    },
    {
      level: '1.1.2',
      name: 'group section 1.1.2',
    },
    {
      level: '1.1.3',
      name: 'group section 1.1.3',
    },
    {
      level: '1.2',
      name: 'group title 2',
    },
    {
      level: '1.2.1',
      name: 'group section 1.1.1',
    },
    {
      level: '1.3',
      name: 'group title 3',
    },
    {
      level: '1.3.1',
      name: 'group section 1.1.1',
    },
    {
      level: '1.3.2',
      name: 'group section 1.1.2',
    },
    {
      level: '1.4',
      name: 'group title 4',
    },
    {
      level: '1.4.1',
      name: 'group section 1.4.1',
    },
    {
      level: '1.4.2',
      name: 'group section 1.4.2',
    },
    {
      level: '1.4.3',
      name: 'group section 1.4.3',
    },
  ];

मैं संरचना को निम्नलिखित वस्तु में बदलने की कोशिश कर रहा हूं (वर्गों को समूहित करें)। ऑब्जेक्ट में संपत्ति के रूप में मूल स्तर का मान और अनुभागों की एक सरणी होती है।

  const obj = {
    '1.1': [
      {
        level: '1.1.1',
        name: 'group section 1.1.1',
      },
      {
        level: '1.1.2',
        name: 'group section 1.1.2',
      },
      {
        level: '1.1.3',
        name: 'group section 1.1.3',
      },
    ],
    '1.2': [
      {
        level: '1.2',
        name: 'group title 2',
      },
      {
        level: '1.2.1',
        name: 'group section 1.1.1',
      },
    ],
    '1.3': [
      {
        level: '1.3',
        name: 'group title 3',
      },
      {
        level: '1.3.1',
        name: 'group section 1.1.1',
      },
      {
        level: '1.3.2',
        name: 'group section 1.1.2',
      },
    ],
    '1.4': [
      {
        level: '1.4.1',
        name: 'group section 1.4.1',
      },
      {
        level: '1.4.2',
        name: 'group section 1.4.2',
      },
      {
        level: '1.4.3',
        name: 'group section 1.4.3',
      },
    ],
  };

मेरे प्रयास सफल नहीं हुए। मैं संरचना को उपरोक्त में बदलने के तरीके पर किसी भी मदद की सराहना करता हूं।

0
pro 3 अप्रैल 2018, 13:47

4 जवाब

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

Array.prototype.reduce() कर सकते हैं arrays से objects बनाने के लिए इस्तेमाल किया जा सकता है।

String.prototype.match() कर सकते हैं strings में पैटर्न का पता लगाने के लिए इस्तेमाल किया जा सकता है।

/\d+\.\d+/ एक या एक से अधिक numbers और उसके बाद एक full stop उसके बाद एक या अधिक numbers

// Input.
const input = [{level: '1.1',name: 'group title 1',},{level: '1.1.1',name: 'group section 1.1.1',},{level: '1.1.2',name: 'group section 1.1.2',},{level: '1.1.3',name: 'group section 1.1.3',},{level: '1.2',name: 'group title 2',},{level: '1.2.1',name: 'group section 1.1.1',},{level: '1.3',name: 'group title 3',},{level: '1.3.1',name: 'group section 1.1.1',},{level: '1.3.2',name: 'group section 1.1.2',},{level: '1.4',name: 'group title 4',},{level: '1.4.1',name: 'group section 1.4.1',},{level: '1.4.2',name: 'group section 1.4.2',},{level: '1.4.3',name: 'group section 1.4.3',},]

// Group.
const group = (array) => array.reduce((o, x) => {
  const key = x.level.match(/\d+\.\d+/)
  if (o[key]) o[key].push(x)
  else o[key] = [x]
  return o
}, {})

// Output.
const output = group(input)

// Proof.
console.log(output)
9
Arman Charan 3 अप्रैल 2018, 11:17

यह अपेक्षित आउटपुट का एक सरलीकृत संस्करण है। कृपया ब्राउज़र कंसोल में आउटपुट की जांच करें, इसलिए स्निपेट के साथ कोई समस्या है। धन्यवाद।

var parent = [];
  var child =[];
  var result =[];

const arr = [
    {
      level: '1.1',
      name: 'group title 1',
    },
    {
      level: '1.1.1',
      name: 'group section 1.1.1',
    },
    {
      level: '1.1.2',
      name: 'group section 1.1.2',
    },
    {
      level: '1.1.3',
      name: 'group section 1.1.3',
    },
    {
      level: '1.2',
      name: 'group title 2',
    },
    {
      level: '1.2.1',
      name: 'group section 1.1.1',
    },
    {
      level: '1.3',
      name: 'group title 3',
    },
    {
      level: '1.3.1',
      name: 'group section 1.1.1',
    },
    {
      level: '1.3.2',
      name: 'group section 1.1.2',
    },
    {
      level: '1.4',
      name: 'group title 4',
    },
    {
      level: '1.4.1',
      name: 'group section 1.4.1',
    },
    {
      level: '1.4.2',
      name: 'group section 1.4.2',
    },
    {
      level: '1.4.3',
      name: 'group section 1.4.3',
    },
  ];

  for(var i=0;i<arr.length;i++){
  if(arr[i].level.length == 3){
 
  parent.push(arr[i]);
  }else{
  child.push(arr[i]);
  }
  }
  
  for(var j=0;j<parent.length;j++){
  result[parent[j].level]=[];
  for(var k=0;k<child.length;k++){
  if(parent[j].level.substring(0, 3)== child[k].level.substring(0, 3)){
   result[parent[j].level].push(child[k]); 
  }
  } 
  }
 console.log(result);
-1
user9585063user9585063 3 अप्रैल 2018, 11:23
  const obj = {};

  for(const {level, name} of array) {
    const key = level.split(".").slice(0, 2).join(".");
    if(obj[key]) {
      obj[key].push({ level, name });
    } else {
      obj[key] = [ { level, name } ];
    }
  }

यह समझने के लिए कि क्या हो रहा है, निम्नलिखित पृष्ठ मदद कर सकते हैं:

के लिए

वस्तु विनाशकारी

ऐरे#पुश

0
Jonas Wilms 3 अप्रैल 2018, 11:10

मेरी राय में, और डीआरवाई सिद्धांत का पालन करते हुए, लोडाश का उपयोग करने का एक और शानदार तरीका होगा जिसमें पहले से ही यह कार्य है।

const group = arr =>_.groupBy(arr, x => x.level.match(/\d+\.\d+/));

_.groupBy https://lodash.com/docs#groupBy

संग्रह के प्रत्येक तत्व को iteratee के माध्यम से चलाने के परिणामों से उत्पन्न कुंजियों से बना एक वस्तु बनाता है। समूहीकृत मूल्यों का क्रम संग्रह में होने वाले क्रम से निर्धारित होता है। प्रत्येक कुंजी का संबंधित मान कुंजी उत्पन्न करने के लिए जिम्मेदार तत्वों की एक सरणी है।

लेकिन निश्चित रूप से ऐसा है यदि आपको बाहरी पुस्तकालय का उपयोग करने की अनुमति है।

परिणामी स्निपेट

const arr = [
    {
      level: '1.1',
      name: 'group title 1',
    },
    {
      level: '1.1.1',
      name: 'group section 1.1.1',
    },
    {
      level: '1.1.2',
      name: 'group section 1.1.2',
    },
    {
      level: '1.1.3',
      name: 'group section 1.1.3',
    },
    {
      level: '1.2',
      name: 'group title 2',
    },
    {
      level: '1.2.1',
      name: 'group section 1.1.1',
    },
    {
      level: '1.3',
      name: 'group title 3',
    },
    {
      level: '1.3.1',
      name: 'group section 1.1.1',
    },
    {
      level: '1.3.2',
      name: 'group section 1.1.2',
    },
    {
      level: '1.4',
      name: 'group title 4',
    },
    {
      level: '1.4.1',
      name: 'group section 1.4.1',
    },
    {
      level: '1.4.2',
      name: 'group section 1.4.2',
    },
    {
      level: '1.4.3',
      name: 'group section 1.4.3',
    },
  ];

const group = arr =>_.groupBy(arr, x => x.level.match(/\d+\.\d+/));

const result = group(arr);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

आपके प्रश्न में यह स्पष्ट नहीं था कि आपको हेडर (1.1, 1.2, आदि) की भी आवश्यकता है, उपरोक्त संस्करण में उन्हें शामिल किया गया है। लेकिन अगर आप उन्हें नहीं चाहते हैं, तो आपको पहले उन्हें सरणी से मिटाना होगा:

arr.filter(x => !/^\d+\.\d+$/.test(x.level))

और सब एक साथ

const group = arr => {
  const noheaders = arr.filter(x => !/^\d+\.\d+$/.test(x.level));
  return _.groupBy(noheaders, x => x.level.match(/\d+\.\d+/));
}
const arr = [
    {
      level: '1.1',
      name: 'group title 1',
    },
    {
      level: '1.1.1',
      name: 'group section 1.1.1',
    },
    {
      level: '1.1.2',
      name: 'group section 1.1.2',
    },
    {
      level: '1.1.3',
      name: 'group section 1.1.3',
    },
    {
      level: '1.2',
      name: 'group title 2',
    },
    {
      level: '1.2.1',
      name: 'group section 1.1.1',
    },
    {
      level: '1.3',
      name: 'group title 3',
    },
    {
      level: '1.3.1',
      name: 'group section 1.1.1',
    },
    {
      level: '1.3.2',
      name: 'group section 1.1.2',
    },
    {
      level: '1.4',
      name: 'group title 4',
    },
    {
      level: '1.4.1',
      name: 'group section 1.4.1',
    },
    {
      level: '1.4.2',
      name: 'group section 1.4.2',
    },
    {
      level: '1.4.3',
      name: 'group section 1.4.3',
    },
  ];

const group = arr => {
  const noheaders = arr.filter(x => !/^\d+\.\d+$/.test(x.level));
  return _.groupBy(noheaders, x => x.level.match(/\d+\.\d+/));
}

const result = group(arr);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
3
Jorjon 3 अप्रैल 2018, 11:47