从字符串数组创建对象
Posted
技术标签:
【中文标题】从字符串数组创建对象【英文标题】: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;
我确信有更好的解决方案可以做到,但我做不到。 所以我愿意接受任何帮助!
提前致谢!
【问题讨论】:
【参考方案1】:您可以使用split 和reduce
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】:您可以使用reduce
和split
将提供数组的字符串。然后使用数组索引 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 参数以上是关于从字符串数组创建对象的主要内容,如果未能解决你的问题,请参考以下文章
08.18 javascript 06 数组 数组的概念 创建数组 读取数组中的元素 稀疏数组 添加和删除数组的元素 数组遍历 多维数组 数组的方法 类数组对象 作为数组的字符串