使用JavaScript的map()函数返回未定义元素的数组。

3

抱歉,这可能很琐碎,但我仍然找不到解决方法:

我有一个包含以下元素的对象:

 0: "A"
 1: "B"
 2: "C"

我想使用map()函数将其转换为类似于这样的东西:
0: {name: "A"}
1: {name: "B"}
2: {name: "C"}

如果我使用这个:

this.xxx = this.operations.map(obj =>  obj.name);
console.log(this.xxx);

或者这样:

this.xxx = this.operations.map(obj => {name:obj} );
 console.log(this.xxx);

xxx的元素未定义。


3
你手头有的是一个对象还是一个数组?map只能用在数组上,如果你手头有的是一个对象,你需要使用一些变通方法。(根据索引值为012,实际上这应该是一个数组。) - Amadan
3
this.operations.map(obj => {name:obj} ) 这段代码看起来像是有问题的 JavaScript。如果你想让箭头函数返回一个 POJO,需要用括号把它包起来: this.operations.map(obj => ({name:obj}) ) - spender
可能是遍历对象属性的重复问题。 - Liam
那么,“this”和“this.operations”分别是什么? - Liam
object.values(operations).map(value => {name:value}) - Mosh Feu
显示剩余2条评论
7个回答

10

当你编写代码时

someArray.map(obj => {
    //this is a code block, not an object definition
} )

花括号是用来包含代码块的,而不是对象字面量。

如果你想让箭头函数返回一个对象,JS要求你用括号把对象字面量包起来,以便正确解析你的意图。

因此:

this.operations.map(obj => ({name: obj}) )

将修复您的映射。

或者,如果您想要执行更复杂的操作,请使用代码块并返回值:

this.operations.map(obj => {
    // do some calculations
    return {name: obj};
})

不知怎么的,我错过了那个( )。无论如何,我们可以将它包含在一个多行映射(obj => { some code... return obj })中。 - msanjay
1
@msanjay 将另一种方法添加到我的答案中。谢谢。 - spender

2
如果我理解正确,你想把它们转换为对象?你可以这样做:

最初的回答:

var x = ["A", "B", "C"];

console.log(x.map(obj => {return {name: obj}}));


谢谢并点赞。但是spender更快,因此接受的答案属于他。 - Sanyifejű

1
尝试一下,使用 Object.entries,保留HTML。

let obj = {
  0: "A",
  1: "B",
  2: "C"
}

let result = Object.entries(obj).map(([,name]) => ({
  name
}));
console.log(result)


1
谢谢并点赞。但是spender更快,因此接受的答案属于他。 - Sanyifejű

1

Map object values to array of objects and then convert it into object using Object.assign

var obj = {
  0: "A",
  1: "B",
  2: "C",
};
console.log(Object.assign({},Object.values(obj).map(a => ({ name: a }))));


谢谢并点赞。但是spender更快,因此接受的答案属于他。 - Sanyifejű

1
由于对象类似于数组,因此您可以添加length属性,使其成为类数组。然后,您可以使用Array.from将其转换为真正的数组,并将转换函数作为第二个参数传递:

const input = {
  0: "A",
  1: "B",
  2: "C"
}

const result = Array.from(
  { ...input, length: Object.keys(input).length },
  item => ({ name: item })
)

console.log(result)


感谢和加1。但是spender更快,因此采纳答案归他所有。 - Sanyifejű

1
首先,如果您有对象,不确定如何使用map函数,因为它是一个数组原型函数。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map但是如果它是数组,您应该尝试这样做:

const operations = [ "A", "B", "C"]

const xxx = operations.map(obj => ({name:obj}) );

console.log(xxx)

您忘记加括号了,https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions#高级语法

但如果它确实是一个对象,那么这应该可以工作(不确定性能如何):

const operations = {
 0: "A",
  1: "B",
  2: "C",
} 

const xxx = {}
Object.entries(operations).forEach(entry => {
  xxx[entry[0]] = { name: entry[1] }
});

console.log(xxx)


谢谢并点赞。但是spender更快,因此接受的答案属于他。 - Sanyifejű

0

由于.map()总是返回一个数组,因此您无法使用它来生成一个对象。 您最好的选择是获取对象中的条目,然后在其上使用.reduce(),如下所示:

const operations = {
  0: 'A',
  1: 'B',
  2: 'C',
}

const res = Object.entries(operations)
    .reduce((acc, [key, val], i) => { acc[i] = { [key]: val }; return acc },{})

console.log(res)


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