【问题标题】:Convert an array of objects to array of the objects' values将对象数组转换为对象值数组
【发布时间】:2019-07-29 05:25:30
【问题描述】:

我正在尝试转换这个数组

let orders = [
  {  amount: '100', user: 'admin', date: 'March 6, 2019' },
  {  amount: '120', user: 'admin', date: 'March 6, 2019' },
  {  amount: '80', user: 'admin', date: 'March 7, 2019' },
  {  amount: '200', user: 'admin', date: 'March 7, 2019' },
];

这样的事情

orders = [
  ['100', 'admin', 'March 6, 2019'],
  ['120', 'admin', 'March 6, 2019'],
  ['80', 'admin', 'March 7, 2019'],
  ['200', 'admin', 'March 7, 2019'],
];

我已经读到 Objects.values() 返回数组中的值,所以我尝试通过使用 forEach() 并在数组中的每个项目上使用 Object.values 来遍历 order 数组。

let newOrders = orders.forEach(order => {
  return Object.values(order);
});

我不知道我所做的是否正确,而且我是 Javascript 新手。请帮帮我。

【问题讨论】:

标签: javascript arrays object javascript-objects


【解决方案1】:

使用destructuring如果输出中需要(对象的)属性排序,请使用此选项

let orders = [
  {  amount: '100', user: 'admin', date: 'March 6, 2019' },
  {  amount: '120', user: 'admin', date: 'March 6, 2019' },
  {  amount: '80', user: 'admin', date: 'March 7, 2019' },
  {  amount: '200', user: 'admin', date: 'March 7, 2019' },
];

console.log(orders.map(({amount,user,date})=>[amount,user,date]))

使用mapObject.values 从对象中获取值。 这并不能保证输出中的顺序与对象中的顺序相同 Refer this

let orders = [
  {  amount: '100', user: 'admin', date: 'March 6, 2019' },
  {  amount: '120', user: 'admin', date: 'March 6, 2019' },
  {  amount: '80', user: 'admin', date: 'March 7, 2019' },
  {  amount: '200', user: 'admin', date: 'March 7, 2019' },
];
console.log(orders.map(e=>Object.values(e)))

【讨论】:

  • 更简单的orders.map(Object.values)
  • 这很重要,因为这意味着您的代码可以为一个订单返回['100', 'admin', 'March 6, 2019'],为另一个订单返回['admin', 80', 'March 7, 2019']
  • 规范不要求顺序,但显然所有主流浏览器都遵循顺序。
  • @JollyJoker False. 我似乎记得 chrome 存在某些问题,尤其是在涉及具有数字键的对象时。它将其排序为 1、111、1245、13 而不是 1、13、111、1245。
  • @I.Am.A.Guy 这是规范中的顺序。见stackoverflow.com/a/30919039/7126740
【解决方案2】:

由于Object.values() 返回的数组中的值顺序无法保证,您应该考虑使用.map() 和一些Object Destructuring。然后,您可以在单独的变量中提取对象属性并以所需的顺序显式返回它们。

const data = [
  { amount: '100', user: 'admin', date: 'March 6, 2019' },
  { amount: '120', user: 'admin', date: 'March 6, 2019' },
  { amount: '80',  user: 'admin', date: 'March 7, 2019' },
  { amount: '200', user: 'admin', date: 'March 7, 2019' }
];

const result = data.map(({ amount, user, date }) => [amount, user, date]);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 您的Object destructuring 链接中似乎没有提到它,但是由于变量名称是相关的并且应该与属性名称匹配,因此保留了顺序。即使变量定义已被修改,const result = data.map(({ date, amount, user }) => [amount, user, date]); 也能正常工作。这个link 帮助我理解了。
【解决方案3】:

你可以试试这个:

orders.map((order) => Object.values(order));

map 将返回一个新数组,而forEach 只是对数组的每个元素进行回调

【讨论】:

    【解决方案4】:

    只需使用orders.map(Object.values)

    let orders = [
      {  amount: '100', user: 'admin', date: 'March 6, 2019' },
      {  amount: '120', user: 'admin', date: 'March 6, 2019' },
      {  amount: '80',  user: 'admin', date: 'March 7, 2019' },
      {  amount: '200', user: 'admin', date: 'March 7, 2019' },
    ];
    
    const result = orders.map(Object.values);
    
    console.log(result)

    【讨论】:

      【解决方案5】:

      无法保证枚举对象属性的顺序 (ref)。最简单的解决方案是按所需顺序显式指定键:

      let result = orders.map(order => [order.amount, order.user, order.date]);
      

      【讨论】:

        【解决方案6】:

        一个更强大的解决方案,如果您有许多实例,其中这些 struct 类对象具有不同的订单/键,则该解决方案非常有用。一种函数方法,propsToArray 将一系列键作为单独的参数,并返回一个函数,该函数对对象执行所需的转换。

        let orders = [
          {  amount: '100', user: 'admin', date: 'March 6, 2019' },
          {  amount: '120', user: 'admin', date: 'March 6, 2019' },
          {  amount: '80',  user: 'admin', date: 'March 7, 2019' },
          {  amount: '200', user: 'admin', date: 'March 7, 2019' },
        ];
        
        // option 1
        let propsToArray = function(...keys) {
            return function(obj) {
                return keys.map(key => obj[key]);
            }
        };
        // option 2
        //  propsToArray = (...keys) => (obj) => keys.map(key => obj[key]);
        
        // resulting function
        let orderToArray = propsToArray("amount", "user", "date");
        
        console.log(orders.map(orderToArray));

        【讨论】:

          【解决方案7】:

          let orders = [
            {  amount: '100', user: 'admin', date: 'March 6, 2019' },
            {  amount: '120', user: 'admin', date: 'March 6, 2019' },
            {  amount: '80',  user: 'admin', date: 'March 7, 2019' },
            {  amount: '200', user: 'admin', date: 'March 7, 2019' },
          ];
          
          const result = orders.map(Object.values);
          
          console.log(result)

          【讨论】:

            【解决方案8】:

            let orders = [{
                amount: '100',
                user: 'admin',
                date: 'March 6, 2019'
              },
              {
                amount: '120',
                user: 'admin',
                date: 'March 6, 2019'
              },
              {
                amount: '80',
                user: 'admin',
                date: 'March 7, 2019'
              },
              {
                amount: '200',
                user: 'admin',
                date: 'March 7, 2019'
              },
            ];
            
            let array = []; //initializing array
            orders.forEach((element) => { //using array function for call back
              for (var j in element) { //looping through each element of array
                array.push(element[j]); //pushing each value of object present inside the orders
              }
            });
            console.log(array); //array is ready

            【讨论】:

              猜你喜欢
              • 2019-04-26
              • 1970-01-01
              • 1970-01-01
              • 2021-05-03
              • 2018-12-04
              • 2021-06-16
              • 1970-01-01
              相关资源
              最近更新 更多