从字符串数组创建一个对象

4

我帮助您翻译内容,这是关于IT技术的问题。

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

我有这个字符串数组:

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);
}

我的工具函数包括:

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;
  }
}

我相信有更好的解决方案,但是我自己无法做到。

所以我很愿意接受任何帮助!

提前感谢!

5个回答

6
您可以使用 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,但由于使用不当而失败了。 - Nulji
1
不客气。作为一个经验法则 - 数组到对象的转换通常可以使用reduce来完成。 - Ori Drori
@OriDrori,我们能否使用析构赋值来获取所有值。例如,如果一个字符串是像origin/abc/def这样的格式,那么它只会取abc,而不是abcdef - brk
如果涉及到嵌套对象,我不会使用解构。我会拆分路径,然后使用另一个循环迭代路径部分的数组以构建结构。 - Ori Drori
如果所有的元素都需要像 ['abc','def'] 这样添加到数组中,则可以使用 rest 参数 @brk - Code Maniac

3

你可以使用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)


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;}


2
你可以使用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);


1
您可以使用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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接