将JavaScript数组转换为具有相同键/值的对象

13

我有一个返回数组的函数,如下:

enter image description here

但我想要在SweetAlert2对话框中填充它。

根据文档示例,期望的输入应该像这样:

inputOptions: {
    'SRB': 'Serbia',
    'UKR': 'Ukraine',
    'HRV': 'Croatia'
  },

如何将我的数组转换为所需的格式,考虑到键和值相同?

因此,类似以下内容将是结果:

{
    'aaa123': 'aaa123',
    'Açucena': 'Açucena',
    'Braúnas': 'Braúnas',
    [...]
}

我尝试过 JSON.stringify,但输出的结果不是我需要的:

"[["aaa123","Açucena","Braúnas","C. Fabriciano","gege","gegeq2","Ipatinga","Joanésia","Mesquita","Rodoviário","teste","teste2","Timóteo","Tomatoentro","ts"]]"


(obj, val) => ({ ...obj, [val]: val }), {} );``` - onlyurei
4个回答

27
这可以通过简单的 reduce 调用来完成:

译文:

这可以通过简单的 reduce 调用来完成:

// Demo data
var source = ['someValue1', 'someValue2', 'someValue3', 'other4', 'other5'];


// This is the "conversion" part
var obj = source.reduce(function(o, val) { o[val] = val; return o; }, {});


// Demo output
document.write(JSON.stringify(obj));


哇,工作得很好!你能解释一下它在做什么吗?听起来太过于hacky了。 - Phiter
@PhiterFernandes - 这里没有什么黑科技,只是一个简单的reduce函数将数组值聚合成一个对象。 - Amit
我当时甚至不知道 reduce 是什么。这就是为什么它对我来说听起来很“hacky”。 - Phiter
两个ESlint规则禁止此操作:no-param-reassign和no-return-assign。 - onlyurei

4
Object.assign(
  {},
  ...['value1', 'value2', 'value3', 'value4', 'value5'].map((value) => ({
    [value]: value,
  })),
)

返回

{value1: "value1", value2: "value2", value3: "value3", value4: "value4", value5: "value5"}

没有常见的 ESlint 规则错误。

3

如果你正在使用jQuery;

$.extend({}, ['x', 'y', 'z']);

如果你不这样做;

Object.assign({}, my_array);

另一个例子:

var arr = [{
  name: 'a',
  value: 'b',
  other: 'c'
}, {
  name: 'd',
  value: 'e',
  other: 'f'
}];

const obj = arr.reduce((total, current) => {
  total[current.name] = current.value;
  return total;
}, {});

console.log(obj);


2
这并没有回答 OP 的问题,它会生成一个带有编号键的对象,而不是键等于值的对象。 - bpylearner

2
这个关键在于你可以使用obj["string"]的技巧来赋值属性:
function ArrayToObject(arr){
    var obj = {};
    for (var i = 0;i < arr.length;i++){
        obj[arr[i]] = arr[i];
    }
    return obj
}

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