我有一个具有名称和值的对象/关联数组。我试图基于具有值的数组的键创建另一个数组。
这是数组
0: {country: "AFG", Biomass: null, Coal: null, Cogeneration: null, Gas: 42}
1: {country: "AGO", Biomass: 10, Coal: 20, Cogeneration: null, Gas: null}
新数组应跳过第一个元素,并从下一个元素开始,并根据具有值的键生成一个数组。 结果数组
{"Biomass","Gas","Coal"}
生物量,煤炭和天然气具有价值,因此应在新数组中显示。国家是第一要素,不应出现。 我尝试了google,但无济于事。
var ks = Object.keys(output);
console.log(ks);
此结果仅返回0和1
答案 0 :(得分:1)
let arr = [ {country: "AFG", Biomass: null, Coal: null, Cogeneration: null, Gas: 42},{country: "AGO", Biomass: 10, Coal: 20, Cogeneration: null, Gas: null}]
let op = arr.reduce((op,inp)=>{
Object.keys(inp).forEach((e,index)=>{
if(!op.has(inp[e]) && index !== 0 && inp[e]){
op.add(e)
}
})
return op;
},new Set())
console.log([...op])
答案 1 :(得分:0)
应用于主数组的Object.keys将仅引用数组的“键”,即对象的从零开始的索引,这就是为什么您得到0和1的原因。
如果要获取数组中包含的对象的键,则应执行以下操作:
let energySources = array.reduce((acc, item) => {
for (let key in item) {
if (item[key] !== null && key !== "country") {
acc.push(key);
}
}
return acc;
}, []);
let uniqueValues = [...new Set(energySources)];
答案 2 :(得分:0)
const input = [
{country: "AFG", Biomass: null, Coal: null, Cogeneration: null, Gas: 42} ,
{country: "AGO", Biomass: 10, Coal: 20, Cogeneration: null, Gas: null}
];
const output = input.reduce((accu, {country, ...rest}) => {
Object.keys(rest).forEach((key) => {
if(rest[key] && !accu.includes(key)) {
accu.push(key);
}
});
return accu;
}, []);
console.log(output);
答案 3 :(得分:0)
这里,您有另一种使用reduce()
的方法,该方法将为具有值的true
生成具有key
个值的对象。最后,我们在其上使用Object.keys()
生成数组。
const input = [
{country: "AFG", Biomass: null, Coal: null, Cogeneration: null, Gas: 42},
{country: "AGO", Biomass: 10, Coal: 20, Cogeneration: null, Gas: null}
];
let res = input.reduce((acc, curr) =>
{
Object.keys(curr).forEach(
(k, i) => !acc[k] && i > 0 && curr[k] && (acc[k] = true)
);
return acc;
}, {});
res = Object.keys(res);
console.log(res);
答案 4 :(得分:0)
var objArr = [
{country: "AFG", Biomass: null, Coal: null, Cogeneration: null, Gas: 42} ,
{country: "AGO", Biomass: 10, Coal: 20, Cogeneration: null, Gas: null}
]
var result = [];
function filterArr(item) {
for(var j in item) {
if(j !== 'country') {
if(item[j]) {
result.push(j);
}
}
}
}
for(var i of objArr) {
filterArr(i);
}
for(var p of result) {
console.log(p);
}
答案 5 :(得分:0)
使用arr.reduce()
遍历数组。
对于每次迭代,请使用getOwnPropertyTypes()
获取对象的键。
filter()
淘汰所有值为null
,密钥为country
或我们的output
中已经包含密钥的密钥。
const arr = [ {country: "AFG", Biomass: null, Coal: null, Cogeneration: null, Gas: 42},{country: "AGO", Biomass: 10, Coal: 20, Cogeneration: null, Gas: null}];
let result = arr.reduce((output, i) => [
...output,
...Object.getOwnPropertyNames(i)
.filter(k => i[k] && k !== "country" && !output.includes(k))
], []);
console.log(result);
在迭代时,我们使用spread syntax将当前结果添加到输出中。例如,[...arr1, ...arr2]
将合并arr1
和arr2
的内容。
答案 6 :(得分:-2)
这是你的意思还是我误解了?
array1.forEach(function(item,index){ array2[item] = index;});