从包含数组属性的基础对象中选择性地创建对象的新数组

时间:2019-08-16 02:23:23

标签: javascript arrays object ecmascript-6

我有一个名为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;
}

2 个答案:

答案 0 :(得分:3)

支持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));

答案 1 :(得分:-1)

return只能返回一个值;您期望返回的值是一个列表,不包含任何内容。到目前为止,这还不是问题,因为还没有任何逻辑可用于处理lang的后续值(尚未明确传递)。

所以您需要做两件事:

  1. 找到不用于构建第一个对象的lang键,并对其进行迭代以构建列表中的后续项
  2. 通过将列表包含在数据结构中来传递单个对象。由于您使用的是JS,因此建议您使用数组。

您已经具有用于构建基本嵌套对象的工作功能,您只需要一种方法来处理其他情况。以下内容应处理一种或多种语言;但是,如果未传递有效的lang,则会过早返回:

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

function getOtherKeys(lang, obj) {
  return Object.keys(obj).filter(key => key != lang)
}


// Repurposed your function
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];

  // my changes below to handle other links
  var keys = getOtherKeys(lang, obj);
  for (var key of keys) {
    newobj['links'].push({
      lang: key,
      url: "/" + key + "/" + obj[key].map(e => e.faq)
    })
  }
  return newobj;
}

// Wrapping your code in an array and handling zeroeth/other keys
function buildObj(lang, obj) {
  var outerObj = [];

  // remove the zeroth key
  var otherKeys = getOtherKeys(lang, obj);

  // Add the primary language
  if (obj[lang]) {
    outerObj.push(getObj(lang, obj));
  } else {
    return;
  }

  // Add all other languages
  for (var key of otherKeys) {
    outerObj.push(getObj(key, obj));
  }
  return outerObj;
}

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

var en = buildObj("en", obj); // Call array wrapper
console.log(en);

var hi = buildObj("hi", obj);
console.log(hi);