使用条目和迭代器来构建数组。
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 数组原型?