我有一个看起来像这样的对象数组:
const myArray = [
{ taxonomy: 'Orange', slug: 'value1'},
{ taxonomy: 'Orange', slug: 'value2'},
{ taxonomy: 'Green', slug: 'value3'},
]
我想将对象的子弹转换为javascript数组,并将它们具有相同的分类法映射在一起:
Result:
[
[value1, value2], // because they share the same taxonomy property.
[value3]
];
如果您有此经历,请帮助我。非常感谢。
答案 0 :(得分:5)
您可以将reduce
方法与Map
一起使用,然后获取数组中的值。
const myArray = [{ taxonomy: 'Orange', slug: 'value1'},{ taxonomy: 'Orange', slug: 'value2'},{ taxonomy: 'Green', slug: 'value3'},]
const res = myArray.reduce((r, {taxonomy, slug}) => {
return r.set(taxonomy, (r.get(taxonomy) || []).concat(slug))
}, new Map).values()
console.log([...res])
答案 1 :(得分:1)
您可以使用taxonomy
结构和hash
方法通过forEach
属性对数组的对象进行分组。
function groupBy(array, property) {
var hash = {};
var result = [];
array.forEach(function (item) {
if (!hash[item[property]]) {
hash[item[property]] = [];
result.push(hash[item[property]]);
}
hash[item[property]].push(item.slug);
});
return result;
}
const myArray = [ { taxonomy: 'Orange', slug: 'value1'}, { taxonomy: 'Orange', slug: 'value2'}, { taxonomy: 'Green', slug: 'value3'}, ];
console.log(groupBy(myArray, "taxonomy"));
答案 2 :(得分:0)
对于这种事情,我使用通用的归约函数。它接受3个参数。您要检查的属性(无论该属性是否唯一)(唯一属性只是变成值,非唯一属性变成值的数组),最后是一个转换函数,您可以使用要提取的数据。>
const myArray = [
{ taxonomy: 'Orange', slug: 'value1'},
{ taxonomy: 'Orange', slug: 'value2'},
{ taxonomy: 'Green', slug: 'value3'},
];
const isStr = source => Object.prototype.toString.call( source ) === '[object String]';
const propHash = ( key_reference, is_unique, transformation_value ) => {
const generateKey = isStr( key_reference )
? item => item[ key_reference ]
: ( item, index, source ) => key_reference( item, index, source );
return ( hash, item, index, source ) => {
const key = generateKey( item, index, source );
if ( !hash.hasOwnProperty( key ) ) {
if ( is_unique ) hash[ key ] = transformation_value ? transformation_value( item, index, source ) : item;
else hash[ key ] = [];
}
if ( !is_unique ) hash[ key ].push( transformation_value ? transformation_value( item, index, source ): item );
return hash;
};
};
const result_hash = myArray.reduce( propHash( 'taxonomy', false, entry => entry.slug ), {});
const result = Object.values( result_hash );
console.log( result );