如何循环一个对象并获取特定值以将其推入数组

3

我有一些案例需要循环遍历一个具有多个键的对象,并获取特定的值,然后将每个值都推送到一个数组中。希望这个论坛上的任何人都能帮助我,谢谢。

[{
  "total_sms": 887,
  "total_submitted": 101,
  "total_in_queue": 696,
  "total_processed": 0,
  "total_delivered": 0,
  "total_failed": 0,
  "date": "2019-08-06"
}, {
  "total_sms": 888,
  "total_submitted": 102,
  "total_in_queue": 697,
  "total_processed": 0,
  "total_delivered": 0,
  "total_failed": 0,
  "date": "2019-08-06"
}]

预期的

total_sms = [887,888]
total_submitted = [101,102]
and etc
6个回答

4
你可以使用Array.reduce来按照每个对象的键进行分组,每个对象的键可以通过Object.keys获得。
现在对于每个存在的键,只需将其添加到数组中,否则创建一个新数组并添加该元素。

const data = [{
  "total_sms": 887,
  "total_submitted": 101,
  "total_in_queue": 696,
  "total_processed": 0,
  "total_delivered": 0,
  "total_failed": 0,
  "date": "2019-08-06"
}, {
  "total_sms": 888,
  "total_submitted": 102,
  "total_in_queue": 697,
  "total_processed": 0,
  "total_delivered": 0,
  "total_failed": 0,
  "date": "2019-08-06"
}];

const grouped = data.reduce((acc, ele) => {
    const keys = Object.keys(ele);
    keys.forEach(key => acc[key] = acc[key] ? acc[key].concat(ele[key]) : [ele[key]]);
    return acc;
 }, {});
 console.log(grouped);
    


@AmardeepBhowmick不是我的问题。只是想在这个问题被标记为重复并删除之前给你一个快速的赞美。 - Travis Acton
@BigbossHighlight 你可以使用 Object.values(yourObject) 来获取外部对象的数据元素,并将其转换为问题中给出的数组形式。 - Fullstack Guy

2

let objs = [{
  "total_sms": 887,
  "total_submitted": 101,
  "total_in_queue": 696,
  "total_processed": 0,
  "total_delivered": 0,
  "total_failed": 0,
  "date": "2019-08-06"
}, {
  "total_sms": 888,
  "total_submitted": 102,
  "total_in_queue": 697,
  "total_processed": 0,
  "total_delivered": 0,
  "total_failed": 0,
  "date": "2019-08-06"
}];

let arrays = objs.reduce((arrays, obj) => {
  Object.entries(obj).forEach(([key, value]) => {
    arrays[key] = arrays[key] || [];
    arrays[key].push(value);
  });
  return arrays;
}, {});

console.log(arrays);


1
var temp = [{
  "total_sms": 887,
  "total_submitted": 101,
  "total_in_queue": 696,
  "total_processed": 0,
  "total_delivered": 0,
  "total_failed": 0,
  "date": "2019-08-06"
}, {
  "total_sms": 888,
  "total_submitted": 102,
  "total_in_queue": 697,
  "total_processed": 0,
  "total_delivered": 0,
  "total_failed": 0,
  "date": "2019-08-06"
}
]

var obj = {

}

 temp.forEach(item => {
   Object.keys(item).map(key => {
     obj[key] = (obj[key]||[]).concat(item[key])
   })
 })

 console.log(obj)

这不是一种动态的方式。 - Neel Rathod

0
如果您想要单个元素数据,那么map()函数会对您有所帮助。

const array = [{
  total_sms: 887,
  total_submitted: 101,
  total_in_queue: 696,
  total_processed: 0,
  total_delivered: 0,
  total_failed: 0,
  date: '2019-08-06',
}, {
  total_sms: 888,
  total_submitted: 102,
  total_in_queue: 697,
  total_processed: 0,
  total_delivered: 0,
  total_failed: 0,
  date: '2019-08-06',
}];


const sms = array.map((m) => { return m.total_sms; });
console.log(sms);

如果您想将所有键存储到一个数组中,那么只需要使用一个 for 循环即可实现。

  const array = [{
    total_sms: 887,
    total_submitted: 101,
    total_in_queue: 696,
    total_processed: 0,
    total_delivered: 0,
    total_failed: 0,
    date: '2019-08-06',
  }, {
    total_sms: 888,
    total_submitted: 102,
    total_in_queue: 697,
    total_processed: 0,
    total_delivered: 0,
    total_failed: 0,
    date: '2019-08-06',
  }];
  
  const result = {};
  
  for (let i = 0; i < array.length; i += 1) {
    const element = array[i];
    Object.keys(element)
      .forEach((subElem) => {
        if (result[subElem]) {
          result[subElem].push(element[subElem]);
        } else {
          result[subElem] = [element[subElem]];
        }
      });
  }
  
  console.log(result);


0

尝试

data.forEach(d => Object.keys(d).forEach(k=> r[k]=(r[k]||[]).concat(d[k]) ));

let data = [{
  "total_sms": 887,
  "total_submitted": 101,
  "total_in_queue": 696,
  "total_processed": 0,
  "total_delivered": 0,
  "total_failed": 0,
  "date": "2019-08-06"
}, {
  "total_sms": 888,
  "total_submitted": 102,
  "total_in_queue": 697,
  "total_processed": 0,
  "total_delivered": 0,
  "total_failed": 0,
  "date": "2019-08-06"
}];

let r={};

data.forEach(d => Object.keys(d).forEach(k=> r[k]=(r[k]||[]).concat(d[k]) ));

Object.keys(r).forEach(k=> this[k]=r[k] ); // save as global variables

console.log('total_sms =', total_sms);
console.log('total_submitted =', total_submitted);
console.log('...')


0
使用数组reduce方法,从一个包含空数组的对象开始,并在其中使用for .. in将初始对象从循环中的当前对象填充:

var temp = [
  {
    total_sms: 887,
    total_submitted: 101,
    total_in_queue: 696,
    total_processed: 0,
    total_delivered: 0,
    total_failed: 0,
    date: "2019-08-06"
  },
  {
    total_sms: 888,
    total_submitted: 102,
    total_in_queue: 697,
    total_processed: 0,
    total_delivered: 0,
    total_failed: 0,
    date: "2019-08-06"
  }
];

const result = temp.reduce(
  (all, curr) => {
    for (let k in curr) {
      all[k].push(curr[k]);
    }
    return all;
  },
  {
    total_sms: [],
    total_submitted: [],
    total_in_queue: [],
    total_processed: [],
    total_delivered: [],
    total_failed: [],
    date: []
  }
);

console.log(result);


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