【问题标题】:Create an object from a string array从字符串数组创建对象
【发布时间】:2019-07-30 20:43:24
【问题描述】:

我正在尝试从字符串数组创建一个对象。

我有这个字符串数组:

let BaseArray = ['origin/develop', 'origin/master', 'toto/branch', 'tata/hello', 'tata/world'];

我想要一个这样的对象:

{
  origin : ['develop', 'master'],
  toto : ['branch'],
  tata : ['hello', 'world']
}

所以目前,我这样做了:

let Obj = {};
let RemoteObj = {};
for (let CurrentIndex = 0; CurrentIndex < BaseArray.length; CurrentIndex++) {
    let Splits = BaseArray[CurrentIndex].split('/');
    if (Splits[0] && Splits[1]) {
        Obj[Splits[0]] = Splits[1].trim();
    }

    if (this.isObjectEmpty(RemoteObj)) {
        RemoteObj = Obj;
    } else {
        RemoteObj = this.mergeObjects(RemoteObj, Obj);
    }
    console.log(RemoteObj);
}

我的 utils 函数是:

mergeObjects(...objs) {
  let Result = {}, Obj;

  for (let Ind = 0, IndLen = objs.length; Ind < IndLen; Ind++) {
    Obj = objs[Ind];

    for (let Prop in Obj) {
      if (Obj.hasOwnProperty(Prop)) {
        if (!Result.hasOwnProperty(Prop)) {
          Result[Prop] = [];
        }
        Result[Prop].push(Obj[Prop]);
      }
    }
  }

  return Result;
}

isObjectEmpty(Obj) {
  for (let Key in Obj) {
    if (Obj.hasOwnProperty(Key)) {
      return false;
    }
    return true;
  }
}

我确信有更好的解决方案可以做到,但我做不到。 所以我愿意接受任何帮助!

提前致谢!

【问题讨论】:

    标签: javascript arrays typescript object


    【解决方案1】:

    您可以使用splitreduce

    let BaseArray = ['origin/develop', 'origin/master', 'toto/branch', 'tata/hello', 'tata/world'];
    
    let op = BaseArray.reduce((op, inp) => {
      let [key, value] = inp.split('/')
      op[key] = op[key] || []
      op[key].push(value)
      return op
    },{})
    
    console.log(op)

    【讨论】:

      【解决方案2】:

      您可以使用reducesplit 将提供数组的字符串。然后使用数组索引 0 处的元素创建 object 键。并将其余的值推送到数组中

      let BaseArray = ['origin/develop', 'origin/kit/sub', 'origin/master', 'toto/branch', 'tata/hello', 'tata/world'];
      
      let newArray = BaseArray.reduce(function(acc, curr) {
        let splitCurr = curr.split('/');
        if (!acc[splitCurr[0]]) {
          acc[splitCurr[0]] = []
        }
        for (let i = 1; i < splitCurr.length; i++) {
          acc[splitCurr[0]].push(splitCurr[i])
      
        }
        return acc;
      }, {});
      
      console.log(newArray)

      【讨论】:

        【解决方案3】:

        您可以使用Array.reduce() 进行此方法。在reduce的每次迭代中,您可以将字符串拆分为/,并将第一个元素用作新对象上的key,然后将第二个元素放在与该key关联的数组中:

        let BaseArray = ['origin/develop', 'origin/master', 'toto/branch', 'tata/hello', 'tata/world'];
        
        let res = BaseArray.reduce((acc, curr) =>
        {
            let [k, v] = curr.split("/");
            (acc[k] = acc[k] || []).push(v);
            return acc;
        }, {});
        
        console.log(res);
        .as-console {background-color:black !important; color:lime;}
        .as-console-wrapper {max-height:100% !important; top:0;}

        【讨论】:

          【解决方案4】:

          您可以使用reduce 方法来构建您的对象。

          let baseArray = ['origin/develop', 'origin/master', 'toto/branch', 'tata/hello', 'tata/world'];
          
          let baseobj = baseArray.reduce((acc, curr) => {
             let items = curr.split('/');
             let key = items[0];
             let value = items[1];
             
             if(acc[key] === undefined) {
                acc[key] = [value] 
             } else {
                acc[key] = [...acc[key], value];
             }
             
             return acc;
          }, {});
          
          console.log(baseobj);

          【讨论】:

            【解决方案5】:

            您可以使用Array.reduce() 来创建对象,方法是将每个字符串拆分为键和值,如果键不存在,则为其分配一个空数组,然后将值推送到数组中:

            const BaseArray = ['origin/develop', 'origin/master', 'toto/branch', 'tata/hello', 'tata/world'];
            
            const result = BaseArray.reduce((r, str) => {
              const [key, value] = str.split('/');
              
              if(!r[key]) r[key] = [];
              
              r[key].push(value);
              
              return r;
            }, {});
            
            console.log(result);

            【讨论】:

            • 谢谢!它完美地工作!我一开始尝试使用 reduce,但由于使用不当而失败。
            • 不客气。根据经验 - 数组到对象的转换通常可以用 reduce 来完成。
            • @OriDrori 我们可以使用解构赋值来获取所有值。例如,如果一个字符串类似于origin/abc/def,那么它只需要abc,而不是abc &def
            • 如果是嵌套对象,我不会使用解构。我会拆分路径,然后用另一个循环迭代路径部分的数组来构建结构。
            • @brk 如果它们都需要像这样添加到数组 ['abc','def'] 中,那么您可以使用 rest 参数
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-03-20
            • 1970-01-01
            • 1970-01-01
            • 2011-08-31
            • 2015-09-08
            • 1970-01-01
            相关资源
            最近更新 更多