我有两个数组,一个带有名称,另一个带有与名称相关的ID。
arr1 = ["Bob Jones", "Steven Simon", "Green Tea"];
arr2 = [10, 8, 13];
arr2
中的ID对应于arr1
中的名称。例如,鲍勃·琼斯(Bob Jones)的ID为10。我想做的是返回一个对象数组,如下所示:
[
{
Id: 10,
Name: Bob Jones
},
{
Id: 8,
Name: Steven Simon
},
{
Id: 13,
Name: Green Tea
}
]
我已尝试根据以下代码使用Object.defineproperties
。
const myOjbect = {};
Object.defineProperties(myObject, {
name: {
value: arr1[0],
enumerable: true,
writable: false,
},
id: {
value: arr2[0],
enumerable: true,
writable: true,
},
})
这为数组中的第一项提供了预期的结果,但我还需要将数组中的后续项包括在对象中(而不仅仅是第一项)。
答案 0 :(得分:3)
不需要Object.defineProperty
/ defineProperties
,您只需在map
回调中使用初始化程序(又称“文字”)语法创建对象:
const result = arr1.map((Name, index) => ({Id: arr2[index], Name}));
之所以可行,是因为map
使用条目的值(在本例中为名称)及其索引(以及您调用map
的对象)调用回调函数,但我们没有使用),因此我们直接使用名称,并从arr2
中的等效位置获取ID。
在JavaScript中,那些属性名称使用小写字母会更加惯用:
const result = arr1.map((name, index) => ({id: arr2[index], name}));
实时示例:
const arr1 = ["Bob Jones", "Steven Simon", "Green Tea"];
const arr2 = [10, 8, 13];
const result = arr1.map((name, index) => ({id: arr2[index], name}));
console.log(result);
.as-console-wrapper {
max-height: 100% !important;
}
如果您需要限制自己使用ES5级功能,而不是我上面使用的ES2015 +功能:
var result = arr1.map(function(name, index) {
return {id: arr2[index], name: name};
});
实时示例:
var arr1 = ["Bob Jones", "Steven Simon", "Green Tea"];
var arr2 = [10, 8, 13];
var result = arr1.map(function(name, index) {
return {id: arr2[index], name: name};
});
console.log(result);
.as-console-wrapper {
max-height: 100% !important;
}
答案 1 :(得分:0)
尝试使用forEach循环
var arr1 = ['Bob Jones', 'Steven Simon', 'Green Tea'];
var arr2 = [10, 8, 13];
var a=[];
arr1.forEach((e,i)=>a.push({id:arr2[i], name:e}))
console.log(a)
答案 2 :(得分:0)
您可以使用具有所需键和其值的对象,并通过将对象映射为其新属性来减少该对象。这适用于密钥的任意计数。数组必须具有相同的长度。
var Id = [10, 8, 13],
Name = ["Bob Jones", "Steven Simon", "Green Tea"],
result = Object.entries({ Id, Name }).reduce((r, [k, a]) =>
a.map((v, i) => Object.assign(r[i] || {}, { [k]: v })),
[]
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }