使用条目和迭代器来构建数组。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用条目和迭代器来构建数组。相关的知识,希望对你有一定的参考价值。

我有一个对象数组。每一个对象都有相同的属性,我试图创建一个函数来返回一个数组,数组中的每一个对象都应该包含基于对象属性名的值。我试图创建一个函数来返回一个数组,其中每个数组内的值应该基于对象的属性名。

输入:预期的输出--数组内部只包含对象的属性名。

input: [
    
       test1: '10',
       test2: '15',
       test3: '14',
       test4: '22'
    ,
    
       test1: '4',
       test2: '1',
       test3: '45',
       test4: '2'
    ,
    
       test1: '5',
       test2: '16',
       test3: '7',
       test4: '0'
    
]

期望输出 - 数组内部只包含键值相同的元素。 例如 test1 数组中的数值。[10, 4, 5]:

output: [[10, 4, 5], [15, 1, 16], [14, 45, 7], [22, 2, 0]]

我的方法是使用array.entry()和迭代器。结果是错误的--值以错误的顺序存储。

let output = [];
sort(input) 
    const results = [[], [], [], []];
    if (input.length > 0) 
      const iterator = input.entries();
      let item = iterator.next();
      while (!item.done) 
        const data = Object.values(item.value[1]);
        results.forEach((result, index) => 
          if (item.value[0] == index)
            result.push(parseFloat(data[index]));
        );
        item = iterator.next();
      
    
    output = results;
  

我如何使它工作?

答案

这里有一种技术,它只是使用第一个对象的键序来决定最终的输出顺序。

const restructure = (input = []) => 
  Object .keys (input [0] || ) 
    .map (k => input .map (x => x [k]))

const input = [test1: '10', test2: '15', test3: '14', test4: '22', test1: '4', test2: '1', test3: '45', test4: '2', test1: '5', test2: '16', test3: '7', test4: '0']

console .log (restructure (input))
.as-console-wrapper min-height: 100% !important; top: 0
另一答案

let input = [
    test1: '10',
    test2: '15',
    test3: '14',
    test4: '22'
  ,
  
    test1: '4',
    test2: '1',
    test3: '45',
    test4: '2'
  ,
  
    test1: '5',
    test2: '16',
    test3: '7',
    test4: '0'
  
]

// initialize result array
let result = [...Array(Object.keys(input[0] || ).length)].map(x => []);
// fill object
input.forEach(val => 
  // push each value into the according position in the result array.
  Object.values(val).forEach((val, i) => 
    result[i].push(val)
  );
);
console.log(result);
另一答案

有意思。但我不会有这种方法,我宁愿少用很多 "东西",像这样.我不明白为什么函数要命名为 "排序",根本就没有排序!

"use strict";

function sort(data)

  var stacks, stacknames;

  stacks = [];
  stacknames = ;

  data.forEach(item => 
    var k;

    for (k in item)
    
      if (!(k in stacknames))
      
        stacknames[k] = stacks.length; // map name to index
        stacks.push([]); // allocate new stack
      

      stacks[stacknames[k]].push(parseFloat(item[k]));
    
  );

  return stacks;


var input = [
    
       test1: '10',
       test2: '15',
       test3: '14',
       test4: '22'
    ,
    
       test1: '4',
       test2: '1',
       test3: '45',
       test4: '2'
    ,
    
       test1: '5',
       test2: '16',
       test3: '7',
       test4: '0'
    
];

var output = sort(input);

console.log(output);
另一答案

如果我们使用以下函数就简单多了 reduce.

var input=[  test1: '10', test2: '15', test3: '14', test4: '22' ,  test1: '4', test2: '1', test3: '45', test4: '2' ,  test1: '5', test2: '16', test3: '7', test4: '0' ];

var result = Object.values(input.reduce((acc, elem)=>
  Object.entries(elem).forEach(([k,v])=>
    acc[k] = acc[k] || [];
    acc[k].push(v);
  )
  return acc;
,));

console.log(result)
另一答案

使用嵌套循环可以得到如下的预期结果。

let input = [
    
       test1: '10',
       test2: '15',
       test3: '14',
       test4: '22'
    ,
    
       test1: '4',
       test2: '1',
       test3: '45',
       test4: '2'
    ,
    
       test1: '5',
       test2: '16',
       test3: '7',
       test4: '0'
    
];

const getValues = (data) => 
  // Get keys in the object
  let keys = Object.keys(data[0]);
  // Initialize the result with empty arrays
  let temp = [...Array(Object.keys(data[0] || ).length)].map(x => []);

  for (let i=0; i<data.length; i++) 
    for (let j=0; j<keys.length; j++) 
      let str = keys[j];
      temp[j].push(data[i][str]);
    
 
 console.log(temp);


getValues(input);

以上是关于使用条目和迭代器来构建数组。的主要内容,如果未能解决你的问题,请参考以下文章

使用反向迭代条目的方法扩展 JavaScript 数组原型?

for循环增强for循环和迭代器的区别

如何使用迭代器来解决这个问题?

顺序容器(迭代器)--C++复习

[如何在C ++中仅使用迭代器来正确地迭代3D向量? [关闭]

遇到零时划分数组