如果值之一匹配,则将对象的值合并到新数组中

时间:2018-12-27 12:32:19

标签: javascript

我有一个看起来像这样的对象数组:

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]
];

如果您有此经历,请帮助我。非常感谢。

3 个答案:

答案 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 );