在JavaScript中,如何在map()函数内动态设置键?

12

所以我知道如何像这样动态设置密钥:

var hashObj = {};
hashObj[someValue] = otherValue;

但我还没有看到关于map()的任何答案:

var list = ['a', 'b', 'c'];

var hashObject = list.map(function(someValue) {
    return { someValue: 'blah' };
});

// should return: [ {'a': 'blah'}, {'b': 'blah'}, {'c': 'blah'} ];

我知道我可以用 for 循环等方法来做到这一点,但是在 JavaScript 中只使用 map() 能否实现呢?

3个回答

16

您需要让 someValue 被评估为它的值。如果您使用对象表示法,它将被按字面意义解释为字符串。

您可以使用一个临时对象来实现您想要的效果:

var list = ['a', 'b', 'c'];

var hashObject = list.map(function(someValue) {
    var tmp = {};
    tmp[someValue] = 'blah';
    return tmp;
});

1
是的,你不能创建一个使用变量名作为属性名的JS字面对象定义。因此,你必须先声明一个对象,然后单独分配属性(使用变量中的属性名),就像这个答案所做的那样。 - jfriend00
2
ES6 简写:return { [someValue]: 'blah' } - Paul

5

我知道这是一个老问题,但答案可能对其他人有帮助。

正如已经说过的那样,Array.prototype.map用于获取新的array

但是如果您想要获得object而不是array - 也许您应该考虑使用Array.prototype.reduce (https://developer.mozilla.org/pl/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)?

const list = ['a', 'b', 'c'];

const hashObject = list.reduce((acc, current) => {
  acc[current] = 'blah';
  return acc;
}, {});

// hashObject equals: {"a":"blah","b":"blah","c":"blah"}

如果你想要达到问题中提到的相同结果,当然可以使用 Array.prototype.map

const list = ['a', 'b', 'c'];

const hashArrayOfObjects = list.map((current) => {
  return {[current]: 'blah'};
});

// hashArrayOfObjects equals: [{"a":"blah"},{"b":"blah"},{"c":"blah"}]

您可以在 CodePen 上查看其工作原理:https://codepen.io/grygork/pen/PojNrXO

0
通常使用'map()'方法从每个返回值获取新数组。在您的情况下,我建议使用forEach()。
var list = ['a','b','c'];
var hashObject = {};
list.forEach( function( key ) {
    hashObject[ key ] = 'blah';
});

或者使用underscore.js库的object()方法

var list = ['a','b','c'];
var hashObject = _.object( list ); // { a: undefined, b: undefined, c: undefined }
hashObject = _.mapObject( hashObject, function( val, key ) {
    return 'blah';
});

然而,Array.prototype.map仅用于获取新的“数组”,而不是“对象”。


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