Как получить массив значений всех свойств объектов внутри массива объектов? - PullRequest
0 голосов
/ 04 июня 2018

Я хочу получить массив значений каждого объекта, который у меня есть.

У меня есть это:

const numDataPoints = [
    {
      x0: {x: 807, y: 625},
      x1: {x: 15, y: 20},
      x2: {x: 5, y: 20}
    },
    {
      x0: {x: 11, y: 6},
      x1: {x: 16, y: 21},
      x2: {x: 7, y: 22}
    }
  ];

Я хочу это:

[
  [807, 625],
  [15, 20],
  [5, 20],
  [11, 6],
  [16, 21],
  [7, 22]
]

Я пробовал это:

numDataPoints.map((array) => array.map(axis => [axis.x, axis.y]));

, но выдает эту ошибку:

Uncaught TypeError: array.map не является функцией

Ответы [ 8 ]

0 голосов
/ 04 июня 2018

Вот несколько разных способов получить два разных результата (исходная структура вложения или плоская структура) - также обратите внимание на сортировку, которая может быть вам полезна - ключи словаря сортируются так, как они объявлены (не буквенно-численно)):

const numDataPoints =  [{ x0: {x: 807, y: 625}, x1: {x: 15, y: 20},
x2: {x: 5, y: 20} }, { x0: {x: 11, y: 6}, x1: {x: 16, y: 21}, x2: {x:7, y: 22} }];

// In case you need them sorted and in the original nesting:
console.log(
  numDataPoints
    .map(d => Object.keys(d).sort().map(k => [d[k].x, d[k].y]))
);

// In case you need them sorted and flattened:
console.log(
  numDataPoints
    .map(d => Object.keys(d).sort().map(k => [d[k].x, d[k].y]))
    .reduce((a,v) => { v.forEach(value => a.push(value)); return a; }, [])
);

// In case you don't need them sorted and in the original nesting:
console.log(
  numDataPoints
    .map(d => Object.keys(d).map(k => [d[k].x, d[k].y]))
);

// In case you don't need them sorted and flattened:
console.log(
  numDataPoints
    .map(d => Object.keys(d).map(k => [d[k].x, d[k].y]))
    .reduce((a,v) => { v.forEach(value => a.push(value)); return a; }, [])
);
0 голосов
/ 04 июня 2018

В вашем массиве numDataPoints нет массивов, но есть обычные объекты, поэтому вы не можете использовать map.

. Вам нужно Object.values.В качестве альтернативы гарантируется тот же порядок ключей x0, x1 и x2, , деструктура с {x0, x1, x2} и затем использование [x0, x1, x2].

Структура numDataPoints предполагает, что на самом деле вам нужен массив из двух массивов, каждый с тремя [x, y] точками, а не только шестью [x, y] точками.Если вы все еще хотите сгладить эти подмассивы, используйте concat или flatMap (в настоящее время кандидат 3-го этапа, скорее всего, станет частью редакции ECMAScript, завершенной в июне 2019 г.).

Вот все шесть возможностей:

const numDataPoints = [
    {
      x0: {x: 807, y: 625},
      x1: {x: 15, y: 20},
      x2: {x: 5, y: 20}
    },
    {
      x0: {x: 11, y: 6},
      x1: {x: 16, y: 21},
      x2: {x: 7, y: 22}
    }
  ];

// Object.values, same structure
console.log(numDataPoints.map((obj) => Object.values(obj).map(({x, y}) => [x, y])));

// Object.values, flattened with concat
console.log([].concat(...numDataPoints.map((obj) => Object.values(obj).map(({x, y}) => [x, y]))));

// Object.values, flattened with flatMap
console.log(numDataPoints.flatMap((obj) => Object.values(obj).map(({x, y}) => [x, y])));

// Destructuring, same structure
console.log(numDataPoints.map(({x0, x1, x2}) => [x0, x1, x2].map(({x, y}) => [x, y])));

// Destructuring, flattened with concat
console.log([].concat(...numDataPoints.map(({x0, x1, x2}) => [x0, x1, x2].map(({x, y}) => [x, y]))));

// Destructuring, flattened with flatMap
console.log(numDataPoints.flatMap(({x0, x1, x2}) => [x0, x1, x2].map(({x, y}) => [x, y])));
0 голосов
/ 04 июня 2018

Проблема в том, что array является объектом, поэтому вам необходимо сопоставить ключи перед использованием другого forEach.

const numDataPoints =  [{ x0: {x: 807, y: 625}, x1: {x: 15, y: 20},x2: {x: 5, y: 20} }, { x0: {x: 11, y: 6}, x1: {x: 16, y: 21}, x2: {x:7, y: 22} }];
var foo = []
numDataPoints.forEach((points) => 
    Object.keys(points).forEach(point => 
        foo.push( [points[point].x, points[point].y] )
    )
);
console.log(foo)
0 голосов
/ 04 июня 2018

Это потому, что вы получаете объект, а не массив.Хотя вы можете попробовать (Es6):

numDataPoints
.map(_ => {
  return Object.values(_)
  .map(({x, y}) => [x, y]);
}).reduce((acc, elem) => [...acc, ...elem], []);
0 голосов
/ 04 июня 2018

Вы можете использовать map метод с Object.values и распространять синтаксис ....

const data =  [{ x0: {x: 807, y: 625}, x1: {x: 15, y: 20}, x2: {x: 5, y: 20} }, { x0: {x: 11, y: 6}, x1: {x: 16, y: 21}, x2: {x:7, y: 22} }];

const result = [].concat(...data.map(Object.values)).map(Object.values)
console.log(result)
0 голосов
/ 04 июня 2018

Используйте для этого сокращение - ниже будет работать и для других данных, так как здесь мы не указываем имена ключей.

const res = numDataPoints.reduce((a, b) => a.concat(Object.keys(b).map(e => Object.values(b[e]))), []);
console.log(res);
<script>
const numDataPoints = [
    {
        x0: {
            x: 807,
            y: 625
        },
        x1: {
            x: 15,
            y: 20
        },
        x2: {
            x: 5,
            y: 20
        }
    }, {
        x0: {
            x: 11,
            y: 6
        },
        x1: {
            x: 16,
            y: 21
        },
        x2: {
            x: 7,
            y: 22
        }
    }
];
</script>
0 голосов
/ 04 июня 2018

Вы можете использовать Object.keys для перебора ключей внутри объекта, например:

let data = [{
  x0: {
    x: 807,
    y: 625
  },
  x1: {
    x: 15,
    y: 20
  },
  x2: {
    x: 5,
    y: 20
  }
}, {
  x0: {
    x: 11,
    y: 6
  },
  x1: {
    x: 16,
    y: 21
  },
  x2: {
    x: 7,
    y: 22
  }
}];

let result = data.map(obj => Object.keys(obj).map((key) => [obj[key].x, obj[key].y]));

console.log(result);

Вы можете сгладить результат, я не уверен.

0 голосов
/ 04 июня 2018

Вы можете использовать Array.map для преобразования каждого объекта в массив двухэлементных массивов, а затем уменьшить, чтобы сгладить результат:

const numDataPoints =  [{ x0: {x: 807, y: 625}, x1: {x: 15, y: 20},
            x2: {x: 5, y: 20} }, { x0: {x: 11, y: 6}, x1: {x: 16, y: 21}, x2: {x:7, y: 22} }];

let result = numDataPoints.map(
    item => Object.values(item).map(({x, y})=> [x, y]))
              .reduce((arr, current) => [...arr, ...current], []);

  console.log(result);
...