1

我有一个包含三个数组的数组,每个数组包含两个元素。我想改变它,以便我有两个新数组,每个数组都包含来自三个原始数组的相同索引。三个原始数组之一包含对象作为其元素,我也想将它们展平,并且只在新数组中包含它们的值。

这是我到目前为止所拥有的:

const results = [
  [0, 1],
  [{a: 'a1a1a1', b: 'b1b1b1'}, {a: 'a2a2a2', b: 'b2b2b2'}],
  ['zero', 'one']
];

let values = [];

let num = 1;

while (num >= 0) {
  let cardVals = results.map(c => c[num]);
  values.unshift(cardVals);
  num--;
};

console.log(values);

我的控制台日志目前看起来像这样:

[ [ 0, { a: 'a1a1a1', b: 'b1b1b1' }, 'zero' ],
  [ 1, { a: 'a2a2a2', b: 'b2b2b2' }, 'one' ] ]

但我希望它看起来像这样:

[ [ 0, 'a1a1a1', 'b1b1b1', 'zero' ],   
[ 1, 'a2a2a2', 'b2b2b2', 'one' ] ]

我可以在我的地图中检查它是数组还是 js 对象,但是有没有办法不这样做呢?

4

2 回答 2

1

您需要检查元素是否为对象。如果是,则需要用于Object.values()获取值的数组。然后,您可以使用concat()将这些连接到结果的当前元素。

const results = [
  [0, 1],
  [{
    a: 'a1a1a1',
    b: 'b1b1b1'
  }, {
    a: 'a2a2a2',
    b: 'b2b2b2'
  }],
  ['zero', 'one']
];

let values = [];

for (let i = 0; i < 2; i++) {
  let cardValues = [];
  results.forEach(el => {
    if (typeof el[i] == 'object') {
      cardValues = cardValues.concat(Object.values(el[i]));
    } else {
      cardValues.push(el[i]);
    }
  });
  values.push(cardValues);
}

console.log(values);

于 2020-01-22T23:21:37.843 回答
1

这是一个解决方案:

const results = [ [0, 1],
                  [{a: 'a1a1a1', b: 'b1b1b1'}, {a: 'a2a2a2', b: 'b2b2b2'}],
                  ['zero', 'one']
                ];

let values = [];

results[0].forEach((_, i) => { // assume all elements have same dimension as first
  values.push(
    results.map(result => 
      typeof result[i] == 'object' ? Object.values(result[i]) : // if object, get its values
                                     result[i]                  // otherwise, get the current value
    ).flat()  // flatten any Object.values()
  )
});

console.log(values);

于 2020-01-22T23:32:41.717 回答