遍历两个数组并返回对象数组

时间:2019-05-14 10:18:41

标签: javascript

我有两个数组,一个带有名称,另一个带有与名称相关的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,
  },
})

这为数组中的第一项提供了预期的结果,但我还需要将数组中的后续项包括在对象中(而不仅仅是第一项)。

3 个答案:

答案 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; }