从另一个具有值的数组的键创建一个数组

时间:2019-02-15 02:26:54

标签: javascript jquery

我有一个具有名称和值的对象/关联数组。我试图基于具有值的数组的键创建另一个数组。

这是数组

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

7 个答案:

答案 0 :(得分:1)

您可以使用reduce Set

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)

  1. 使用arr.reduce()遍历数组。

  2. 对于每次迭代,请使用getOwnPropertyTypes()获取对象的键。

  3. 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]将合并arr1arr2的内容。

答案 6 :(得分:-2)

这是你的意思还是我误解了?

array1.forEach(function(item,index){ array2[item] = index;});