【问题标题】:Javascript loop through array of objects and take two values and insert into new array of objectsJavascript循环遍历对象数组并获取两个值并插入新的对象数组
【发布时间】:2025-12-04 18:25:01
【问题描述】:

我有一个如下所示的对象数组:

rows [
{ id: 3,
 title: "sometitle", 
 catid: 55, 
 img: "file" },
{ id: 4,
 title: "sometitle", 
 catid: 55, 
 img: "file" },
{ id: 5,
 title: "sometitle", 
 catid: 55, 
 img: "file" },
]

我现在要做的是循环遍历对象数组并从每个对象中获取两个值(id 和 img)并将其插入到新的对象数组中,因此它最终看起来像这样:

newArr [
{ id: 3,
 img: "file" },
{ id: 4,
 img: "file" },
{ id: 5,
 img: "file" },
]

【问题讨论】:

  • 你试过什么?请展示您的尝试,以便我们帮助修复它。修复语法错误,这样你就可以展示你所做的努力。
  • array.map(function(item) { return {id: item.id, img: item.img}});

标签: javascript arrays object ecmascript-6


【解决方案1】:

您可以使用map 轻松做到这一点。

var rows = [
{ id: 3,
 title: "sometitle", 
 catid: 55, 
 img: "file" },
{ id: 4,
 title: "sometitle", 
 catid: 55, 
 img: "file" },
{ id: 5,
 title: "sometitle", 
 catid: 55, 
 img: "file" },
];

var newArr = rows.map(function(elem) {
    return {
        id: elem.id,
        img: elem.img
    };
});

console.log('newArr', newArr);

【讨论】:

  • 获得赞成票,有时在我使用的较大测试中获胜
【解决方案2】:

只需通过传递callback 函数来使用map 方法。

let rows = [ { id: 3, title: "sometitle", catid: 55, img: "file" }, { id: 4, title: "sometitle", catid: 55, img: "file" }, { id: 5, title: "sometitle", catid: 55, img: "file" }]

console.log(rows.map(function({id, img}){
  return {id, img};
}));

或使用arrow 函数。

let rows = [ { id: 3, title: "sometitle", catid: 55, img: "file" }, { id: 4, title: "sometitle", catid: 55, img: "file" }, { id: 5, title: "sometitle", catid: 55, img: "file" }]

console.log(rows.map(({ id, img }) => ({ id, img })));

【讨论】:

  • 请注意,第一个在我的 Firefox 中似乎更快(请参阅我的“未回答”:)
【解决方案3】:

Array.prototype.map 的经典之作

const rows = [{
    id: 3,
    title: "sometitle",
    catid: 55,
    img: "file"
  },
  {
    id: 4,
    title: "sometitle",
    catid: 55,
    img: "file"
  },
  {
    id: 5,
    title: "sometitle",
    catid: 55,
    img: "file"
  },
];

const newArr = rows.map(({id,img}) => ({id,img}));

console.log(newArr);

【讨论】:

  • 有时在我的测试中工作得非常快,并没有达到最快的速度(我的超级不确定测试
【解决方案4】:

使用map的ES6方法:

const rows = [
  { id: 3, title: "sometitle", catid: 55, img: "file" },
  { id: 4, title: "sometitle", catid: 55, img: "file" },
  { id: 5, title: "sometitle", catid: 55, img: "file" },
];

const out = rows.map(({ id, img }) => ({ id, img }));

console.log(out);

【讨论】:

  • 有时在我的测试中运行得非常快,与最快的不一致(我的超级不确定测试)
【解决方案5】:

使用此代码:-

let rows = [
{ id: 3, title: "sometitle", catid: 55, img: "file" },
{ id: 4, title: "sometitle", catid: 55, img: "file" },
{ id: 5, title: "sometitle", catid: 55, img: "file" }]

let newRows = [];

rows.forEach(function(value,index){
      let obj = {};
      obj.id = value['id'],
      obj.img = value['img']
      newRows.push(obj);
});

【讨论】:

  • 在我的测试中几乎总是最慢的,但确实有效。
【解决方案6】:

这不是一个真正的答案,使用其他答案: 但是:只是为了好玩,我对所提供的解决方案进行了一些粗略的测试(我使用了一台带有 Firefox 的超级旧电脑,你的结果可能会有所不同.

只是为了好玩,利用我从其他问题中提取的 * :) 添加了对东西的引用。

编辑在测试 8 中添加了接受的答案

我的结果:运行您自己的测试,多次结果各不相同

test0 forEach 78.75
test1 map arrow 82.6
test2 map function 78.85
test3 negative for compact 12.6
test4 for 13.3
test5 cached len for 61.55
test6 negative for long 10
test7 negative while 12.5
test8 map accepted 91.35 // the accepted answer, sometimes it is faster

Second execution: note how it changes **RUN YOUR OWN TESTS**

test0 forEach 155.95  // nearly always the looser
test1 map arrow 13.25
test2 map function 14.9
test3 negative for compact 7  // sometimes wins!
test4 for 18.7
test5 cached len for 7.8
test6 negative for long 61.65
test7 negative while 23.4
test8 map accepted 10.15  // odd it is fast sometimes, sometimes not

Before I added the last test: (so comments are relevant)

  test  name    avg milliseconds on 100,000
  test0 forEach 279.15
  test1 map arrow 21.25
  test2 map function 10.1
  test3 negative for compact 22.6
  test4 for 15.55
  test5 cached len for 18.75
  test6 negative for long 185.7
  test7 negative while 35.05

// two executions 100 times instead of 20

/* test 100 times
test0 forEach 205.56
test1 map arrow 20.35
test2 map function 20.72
test3 negative for compact 27.07
test4 for 40.75
test5 cached len for 18.39
test6 negative for long 10.37
test7 negative while 12.93
test8 map accepted 9.53

100 times again
    
test0 forEach 151.19
test1 map arrow 18.22
test2 map function 40.27
test3 negative for compact 87.53
test4 for 48.18
test5 cached len for 17.14
test6 negative for long 14.06
test7 negative while 16.53
test8 map accepted 13.41

Excerpt of code :test2

`var newRows2 = rows.map(function({id,img}) {return {id,img};});`

我凌乱的测试:

// create an array we can append to
const rows = [{
    id: 3,
    title: "sometitle",
    catid: 55,
    img: "file"
  },
  {
    id: 4,
    title: "sometitle",
    catid: 55,
    img: "file"
  },
  {
    id: 5,
    title: "sometitle",
    catid: 55,
    img: "file"
  }
];
// hold some results
var testresult = [];

// add some objects to our array, bulk it up
for (var a = 0; a < 100000; a++) {
  rows.push({
    id: a,
    title: "sometitle",
    catid: a,
    img: "file"
  });
}
// go grab a group by from here: https://*.com/a/38327540/125981
function groupBy6(list, keyGetter) {
  const map = new Map();
  list.forEach((item) => {
    const key = keyGetter(item);
    const collection = map.get(key);
    if (!collection) {
      map.set(key, [item]);
    } else {
      collection.push(item);
    }
  });
  return map;
}
// just to make it simple, push in a result
function testResult(test, name, value1, value2) {
  testresult.push({
    test: test,
    value: value2 - value1,
    name: name
  });
}
// go grab a sum function from here: https://*.com/a/23249575/125981 (in the comments)
var sum = function(items, prop) {
  if (items == null) {
    return 0;
  }
  return items.reduce(function(a, b) {
    return b[prop] == null ? a : a + b[prop];
  }, 0);
};
// some super ugly tests :)
function test() {
  // test
  var t0 = performance.now();
  newRows0 = [];
  rows.forEach(function(value, index) {
    let obj = {};
    obj.id = value['id'];
    obj.img = value['img'];
    newRows0.push(obj);
  });
  var t1 = performance.now();
  testResult("test0", "forEach", t0, t1);

  var t2 = performance.now();
  const newRows1 = rows.map(({
    id,
    img
  }) => ({
    id,
    img
  }));
  var t3 = performance.now();
  testResult("test1", "map arrow", t2, t3);

  var t4 = performance.now();
  var newRows2 = rows.map(function({
    id,
    img
  }) {
    return {
      id,
      img
    };
  });
  var t5 = performance.now();
  testResult("test2", "map function", t4, t5);

  var t6 = performance.now();
  newRows3 = [];
  for (var i = rows.length; i--;) {
    newRows3.push({
      "id": rows[i]['id'],
      "img": rows[i]['img']
    });
  }
  var t7 = performance.now();
  testResult("test3", "negative for compact", t6, t7);

  var t8 = performance.now();
  newRows4 = [];
  for (var i = 0; i < rows.length; i++) {
    newRows4.push({
      "id": rows[i]['id'],
      "img": rows[i]['img']
    });
  }
  var t9 = performance.now();
  testResult("test4", "for", t8, t9);

  var t10 = performance.now();
  newRows5 = [];
  var len = rows.length;
  for (var i = 0; i < len; i++) {
    newRows5.push({
      "id": rows[i]['id'],
      "img": rows[i]['img']
    });
  }
  var t11 = performance.now();
  testResult("test5", "cached len for", t10, t11);

  var t12 = performance.now();
  newRows6 = [];
  for (var i = rows.length - 1; i >= 0; i--) {
    newRows6.push({
      "id": rows[i]['id'],
      "img": rows[i]['img']
    });
  }
  var t13 = performance.now();
  testResult("test6", "negative for long", t12, t13);

  var t14 = performance.now();
  newRows7 = [];
  var i = rows.length;
  while (i--) {
    newRows7.push({
      "id": rows[i]['id'],
      "img": rows[i]['img']
    });
  }
  var t15 = performance.now();
  testResult("test7", "negative while", t14, t15);

  var t16 = performance.now();
  var test8 = rows.map(function(elem) {
    return {
      id: elem.id,
      img: elem.img
    };
  });
  var t17 = performance.now();
  testResult("test8", "map accepted", t16, t17);
}
// run the test 20 times, not super great statistically speaking
for (var t = 0; t < 20; t++) {
  test();
}
// get each group and sum them up in an ugly way
const groupeds = groupBy6(testresult, tst => tst.test);
var groupy = Array.from(groupeds);
groupy.forEach(function(entry) {
  var s = sum(entry[1], "value");
  var sn = +(s / entry[1].length).toFixed(2);
  console.log(entry[0], entry[1][0].name, sn);
});

【讨论】:

  • 是的,这很有趣。而且似乎map 比简单的for 循环更快。 +1。
  • @MihaiAlexandru-Ionut 在大多数情况下,但并非总是如此,重新执行可以并且会给出各种结果,有时在我的超级粗略测试中会有所偏差。
【解决方案7】:

这不是 Java,而是行在哪里。您不是在制作一条线,而是在制作一个数组,所以如果您正在制作一条线,您还不如只做变量。

试试这个

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array

【讨论】:

  • 列。我的意思是第一句中的列