简体   繁体   English

如何从元素数量由 Object.values 确定的对象生成数组?

[英]How to produce an array from an object where the number of elements is determined by Object.values?

I have an object like so:我有一个像这样的对象:

{ green: 2, blue: 1, red: 2}

How can I turn it into an array that looks like this:我怎样才能把它变成一个看起来像这样的数组:

[ 'green', 'green', 'blue', 'red', 'red']

Could be done like this:可以这样做:

Object.entries(obj).flatMap(([k, v]) => Array(v).fill(k));

Example:例子:

 const obj = { green: 2, blue: 1, red: 2}; const res = Object.entries(obj).flatMap(([k, v]) => Array(v).fill(k)); console.log(res);

This is a neat way with a generator.这是使用生成器的巧妙方法。 Perhaps a little overkill for this example.对于这个例子来说,也许有点矫枉过正。

 function* makeIterator(obj) { const keys = Object.keys(obj); for (const key of keys) { const value = obj[key]; for (let i = 0; i < value; i++) { yield key; } } } const obj = {green: 2, blue: 1, red: 2}; console.log(Array.from(makeIterator(obj)));

Use reduce with Object.entries :reduceObject.entries一起使用:

 const obj = { green: 2, blue: 1, red: 2}; const res = Object.entries(obj).reduce((a, [k, v]) => (a.push(...new Array(v).fill(k)), a), []); console.log(res);

Object.entries will do that - it gives a key: value pair of each property in the object. Object.entries 会做到这一点——它给出了对象中每个属性的 key: value 对。 You then use the value to push the key into an array that gives you the desired output.然后,您可以使用该值将密钥推送到一个数组中,该数组为您提供所需的输出。

 var obj = { green: 2, blue: 1, red: 2}; var newArr = []; var objEntries = Object.entries(obj); objEntries.forEach(function(item){ for(var i = 0; i < item[1]; i++){ newArr.push(item[0]) }; }) console.log(newArr); // gives //[ 'green', 'green', 'blue', 'red', 'red']

var data={ green: 2, blue: 1, red: 2};
var newData=[];
for(let i in data){
    for(let j=0;j<data[i];j++){
        newData.push(i);
    }
}
console.log('newData = ', newData);

output输出

newData = ["green", "green", "blue", "red", "red"]

In the case you do not want to deal with polifills for flatMap support in IE etc you can also consider this solution which is based only on Object.keys and Array.forEach :如果您不想在 IE 等中处理用于flatMap 支持的polifills,您也可以考虑这个仅基于Object.keysArray.forEach 的解决方案:

 let obj = {green: 2, blue: 1, red: 2}, arr=[] Object.keys(obj).forEach(x => arr.push(...Array(obj[x]).fill(x))) console.log(arr)

Another approach you can take to avoid ES6 Array destructuring is via Array.reduce and Object.entries :另一种避免 ES6 数组解构的方法是通过Array.reduceObject.entries

 let obj = {green: 2, blue: 1, red: 2} let r = Object.entries(obj).reduce((r,[k,v]) => r.concat(Array(v).fill(k)),[]) console.log(r)

Using map and flat if you don't want to use flatMap directly如果不想直接使用 flatMap,请使用 map 和 flat

const obj = { 
   green: 2, 
   blue: 1, 
   red: 2
};

const responseArray = Object.entries(obj)
    .map(([key,value]) => {
        return Array(value).fill(key)
}).flat();

console.log(responseArray);
//  ["green", "green", "blue", "red", "red"]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM