如何基于另一个对象数组创建一个对象数组?

18

我有一个数组:

var arr1 = [
 {"user":"dan","liked":"yes","age":"22"},
 {"user":"sarah","liked":"no","age":"21"},
 {"user":"john","liked":"yes","age":"23"},
];
我希望创建一个新的数组(子数组),其中只包含用户的喜好。
因此,它看起来像这样:
var arr2 = [
 {"dan":"yes"},
 {"sarah":"no"},
 {"john":"yes"},
];

我尝试了:

var arr2 =[];
for(var i in arr1){
  arr2.push({[i[user]]:i[liked]});
}

需要微调,有什么想法吗?

8个回答

37

使用array.map方法

var arr1 = [
 {"user":"dan","liked":"yes","age":"22"},
 {"user":"sarah","liked":"no","age":"21"},
 {"user":"john","liked":"yes","age":"23"},
];

var arr2 = arr1.map(v => ({ user: v.user, liked: v.liked }));

console.log(arr2);

虽然通过array.map可以实现,但是我建议您使用键值对结构,需要使用array.reduce

  var arr1 = [
   {"user":"dan","liked":"yes","age":"22"},
   {"user":"sarah","liked":"no","age":"21"},
   {"user":"john","liked":"yes","age":"23"},
  ];

  var arr2 = arr1.reduce((c, v) => (c[v.user] = v.liked, c) , {});

  console.log(arr2);


3

根据您的编辑:

arr1 = arr1.map(function(item){
  return{
    [item.user]: item.liked
  }
});


3

var arr1 = [
 {"user":"dan","liked":"yes","age":"22"},
 {"user":"sarah","liked":"no","age":"21"},
 {"user":"john","liked":"yes","age":"23"},
];

var res = arr1.map(function(o) {
  var r = {};
  r[o.user] = o.liked;
  return r;
});

console.log(res);

或在最近的ECMAScript版本中:

var arr1 = [
 {"user":"dan","liked":"yes","age":"22"},
 {"user":"sarah","liked":"no","age":"21"},
 {"user":"john","liked":"yes","age":"23"},
];

var res = arr1.map(o => ( { [o.user]: o.liked } ));

console.log(res);


1
你可以将解构后的属性映射到一个新对象中。

var array1 = [{ user: "dan", liked: "yes", age: "22" }, { user: "sarah", liked: "no", age: "21" }, { user: "john", liked: "yes", age: "23" }],
    array2 = array1.map(({ user, liked }) => ({ [user]: liked }));

console.log(array2);

ES5

var array1 = [{ user: "dan", liked: "yes", age: "22" }, { user: "sarah", liked: "no", age: "21" }, { user: "john", liked: "yes", age: "23" }],
    array2 = array1.map(function (o) {
        var temp = {};
        temp[o.user] = o.liked;
        return temp;
    });

console.log(array2);


1

array.map方法能够帮助你,在你的理解中,由于map方法会基于你的逻辑返回一个新的数组。下面的例子简单易懂。

const arr1 = [
  {"user":"dan","liked":"yes","age":"22"},
  {"user":"sarah","liked":"no","age":"21"},
  {"user":"john","liked":"yes","age":"23"},
 ];
 
 const arr2 = arr1.map(({user, liked}) => ({ [user]:liked }));
 
 console.log(arr2);


1

试试这个

var arr2 =[];
for(var i in arr1){
    var obj= {};
    obj[arr1[i]['user']] = arr1[i]['liked'];
    arr2.push(obj)
} 

1
var arr2=[];
arr1.forEach(function(obj)
{
    var temp=new Object();
    temp[obj.user]=obj.liked;
    arr2.push(temp);
});

我想这就是你想要的。

0
如果它是一个对象数组
var arr1=[{},{},..]
并且您需要循环遍历对象属性,那么您需要这个。
var arr2 =[]



 arr1.forEach(element => {
      var temp = new Object();
      for (var name in element) {
        temp[name] = element[name]
      }
      arr2 .push(temp)
    });

现在你有 arr2,它是一个与 arr1 不同的对象。

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