【问题标题】:How to change the object depending value type javascript?如何根据值类型javascript更改对象?
【发布时间】:2020-09-07 05:18:28
【问题描述】:

如何在 javascript 中将嵌套对象更改为新对象。

我有一个对象obj,如果详细信息是数组,则将第一个数组值作为javascript中的值。

function newObj(obj1) {
  let map = {};
  obj1.forEach(e => {
    let details = e.details;
    Object.values(details).forEach(value => {
      if (Array.isArray(value) && value.length > 0) {
        map[value[0]] = value[0];
      }
      else if (typeof value === 'object') {
        Object.values(value).forEach(val => { map[val] = val; });
      }
    })
  });
  return map;
}

var obj1 = [
  {
    details : {
      "info"  : ["stocks", "finance", ""],
      "sales" : ["analytics"]
    }
  }
];
var obj2 = [
  {
    details : {
      "city" : "SG"
    }
  }
];
var r1 = this.newObj(obj1);
var r2 = this.newObj(obj2);

预期输出

//for obj1 (show only first value of array)
{
  info  : "stocks",
  sales : "analytics"
}
//obj2
{
  city : "SG"
}

【问题讨论】:

  • @Teemu 我已经更新了代码,谢谢回复
  • r1r2放在obj1obj2之后?为什么this.
  • obj2 无效。 {"SG"} 是什么?你的意思是["SG"]
  • @iAmOren 感谢您的回复,更新代码

标签: javascript arrays object


【解决方案1】:

我认为你把这件事复杂化了。看下面的例子。逻辑是这样的:

  1. 迭代details keys
  2. 如果key下的value是一个数组,则在map中创建key并赋值value[0]
  3. 如果 key 下的 value 不是数组,则只需将其值复制到map

这足以实现你想要的。

function newObj(obj){
  let map = {};
  obj.forEach(e => {
    let details = e.details;
    Object.keys(details).forEach(key => {
      var value = details[key];
      if (Array.isArray(value) && value.length > 0){
        map[key] = value[0];
      } else {
        map[key] = value;
      }
    });
  });
  return map;
}

var obj1 = [
  {
    details: {
      "info":["stocks","finance",""],
      "sales":["analytics"]
    }
  }
];

var obj2 = [
  {
    details: {
        "city":"SG"
    }
  }
];

var r1 = newObj(obj1);
var r2 = newObj(obj2);

console.log(r1);
console.log(r2);

【讨论】:

    【解决方案2】:

    由于解构分配,这是一个非常简洁的解决方案:

    function newObj(obj) {
        const [{ details }] = obj;
        const entries = Object.entries(details)
            .map(([key, value]) => ([key, Array.isArray(value) ? value[0] : value]));
        return Object.fromEntries(entries);
    }
    

    活生生的例子:

    'use strict';
    
    function newObj(obj) {
        const [{ details }] = obj;
        const entries = Object.entries(details)
            .map(([key, value]) => ([key, Array.isArray(value) ? value[0] : value]));
        return Object.fromEntries(entries);
    }
    
    const obj1 = [
        {
            details: {
                info: ['stocks', 'finance', ''],
                sales: ['analytics']
            }
        }
    ];
    
    const obj2 = [
        {
            details: {
                city: 'SG'
            }
        }
    ];
    
    console.log(newObj(obj1));
    console.log(newObj(obj2));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 2016-08-04
      • 2016-07-31
      • 2010-11-04
      • 2016-04-28
      • 2011-03-11
      • 2019-03-09
      相关资源
      最近更新 更多