首页 > 解决方案 > 从包含数组属性的基础对象有选择地创建一个新的对象数组

问题描述

我有一个名为的对象obj,它将用作以某种格式创建新的对象数组的基础。

我的基础对象:

var obj={
  "en": [{
    "faq": "faq",
    "about": "about"
    }],
  "hi": [{
    "faq": "aksar-poochhe-jaane-vaale",
    "about": "hamaare-baare"
    }]    
}

我创建了一个getObj()接受两个参数lang和基础对象的函数obj的函数。


示例场景

当我打电话时:

getObj("en", obj);

我应该得到:

[{
  "url": "/en/faq",
  "links": [
     { lang: 'en', url: '/en/faq' },
     { lang: 'hi', url: '/hi/aksar-poochhe-jaane-vaale' }
   ]
 },
 {
  "url": "/en/about",
  "links": [
     { lang: 'en', url: '/en/about' },
     { lang: 'hi', url: '/hi/hamaare-baare' }
   ]
 }]

当我打电话时:

getObj("hi", obj);

我应该得到:

 [{
  "url": "/hi/aksar-poochhe-jaane-vaale", 
  "links": [
     { lang: 'en', url: '/en/faq' },
     { lang: 'hi', url: '/hi/aksar-poochhe-jaane-vaale' }
   ]
 },
 {
  "url": "/hi/hamaare-baare",
  "links": [
     { lang: 'en', url: '/en/about' },
     { lang: 'hi', url: '/hi/hamaare-baare' }
   ]
 }]

以下是我尝试过的:

function getObj(lang, obj){
  var newobj = {};
  newobj['url'] = "/"+ lang +"/"+obj[lang].map(e=>e.faq);
  var s ={lang: lang, url: newobj.url};
  newobj['links']=[s];
  return newobj;
}

标签: javascriptarraysobjectecmascript-6

解决方案


支持obj.enobj.hi包含多个对象。

免责声明:此代码未按最初要求输出对象数组。相反,它是一个以“页面”为键的对象。(这使代码更有效率。)如果您需要确切的输出,请查看下面的答案。

var obj={
  "en": [{
    "faq": "faq",
    "about": "about"
    }],
  "hi": [{
    "faq": "aksar-poochhe-jaane-vaale",
    "about": "hamaare-baare"
    }]    
}

function getObj(origLang, obj) {
  if (typeof obj !== 'object') { return false; }
  
  let result = {};
  
  Object.keys(obj).forEach((lang) => { // Loop languages
    obj[lang].forEach((pages) => {
      if (typeof pages !== 'object') { return false; }

      Object.keys(pages).forEach((page) => { // Loop pages
        const url = pages[page];
        
        // Create array if doesn't exist
        if (typeof result[page] == 'undefined') {
          result[page] = {'url': '', 'links': []};
        }
        
        // If original lang, add the url
        if (origLang == lang) { result[page]['url'] = `/${origLang}/${url}`; }
        
        // Add the links
        result[page]['links'].push({
            'lang': lang,
            'url': `/${origLang}/${url}`
        });
      });
    });
  });
  return result;
}

// Output to console.
console.log('The "en" array');
console.log(getObj('en', obj));

console.log('The "hi" array');
console.log(getObj('hi', obj));

旧版本。更具可读性,但需要循环对象两次。

var obj={
  "en": [{
    "faq": "faq",
    "about": "about"
    }],
  "hi": [{
    "faq": "aksar-poochhe-jaane-vaale",
    "about": "hamaare-baare"
    }]    
}

function getObj(lang, obj){
  const target = obj[lang];
  let results = [];
      
  target.forEach((pages) => {
   if (typeof pages !== 'object') { return false; }
   Object.keys(pages).forEach((page) => {
      const url = pages[page]; // Get the url
      results.push({
        'url': "/" + lang + "/" + url,
        'links': getLinks(page, obj) // Form the links
      });
    });
  });
  
  return results;
}

function getLinks(page, obj) {
  let links = [];
  if (typeof obj !== 'object') { return false; }
   Object.keys(obj).forEach((lang) => {
      obj[lang].forEach((target) => {
        links.push({
          'lang': lang,
          'url': "/" + lang + "/" + target[page]
        });
      });
  });
  return links;
}

// Output to console.
console.log('The "en" array');
console.log(getObj('en', obj));

console.log('The "hi" array');
console.log(getObj('hi', obj));

旧的 Javascript:

var obj={
  "en": [{
    "faq": "faq",
    "about": "about"
    }],
  "hi": [{
    "faq": "aksar-poochhe-jaane-vaale",
    "about": "hamaare-baare"
    }]    
}

function getObj(lang, obj){
  var target = obj[lang], 
      results = [];
      
  for (var i = 0; i < target.length; i++) {
    var pages = target[i]; // Get the object {"faq": "faq", "about", "about"}

    for (var page in pages) {
      if (!pages.hasOwnProperty(page)) { continue; }

      var url = pages[page]; // Get the url
      results.push({
            'url': "/" + lang + "/" + url,
            'links': getLinks(page, obj) // Form the links
      });
    }
  }
  
  return results;
}

function getLinks(page, obj) {
  var links = [];
  for (var lang in obj) { // Loop through each language
    if (!obj.hasOwnProperty(lang)) { continue; }
    
    var targets = obj[lang];
    
    for (var i=0; i < targets.length; i++) {
      var target = targets[i];
      links.push({
          'lang': lang,
          'url': "/" + lang + "/" + target[page]
      });
    }
  }
  return links;
}

// Output to console.
console.log('The "en" array');
console.log(getObj('en', obj));

console.log('The "hi" array');
console.log(getObj('hi', obj));


推荐阅读