json数组去重的5种方法

3,413 阅读2分钟

@[TOC]

方法一 reduce

/*
 * json数组去重
 * @param: {Array} jsonArr 去重之前的数组
 * @param  {String} field  需要去重的字段值
 * @return {Array}        去重之后的数组
 */
export function uniqueJsonArrByField(jsonArr, field) {
    // 数组长度小于2 或 没有指定去重字段 或 不是json格式数据
    if (jsonArr.length < 2 || !field || typeof jsonArr[0] !== "object") return jsonArr;
    const uniqueArr = jsonArr.reduce((all, next) => all.some((item) => item[field] == next[field]) ? all : [...all, next], []);
    return uniqueArr;
}

方法二 filter和Map

/**
 * json数组去重
 * @param  {Array} jsonArr 去重之前的数组
 * @param  {String} field  需要去重的字段值
 * @return {Array}        去重之后的数组
 */
export function uniqueJsonArrByField(jsonArr, field) {
    // 数组长度小于2 或 没有指定去重字段 或 不是json格式数据
    if (jsonArr.length < 2 || !field || typeof jsonArr[0] !== "object") return jsonArr;
    const res = new Map(); // 标识对象
    const uniqueArr = jsonArr.filter((item) => !res.has(item[field]) && res.set(item[field], true));
    return uniqueArr;
}

方法三 变异for

/**
 * json数组去重
 * @param  {Array} jsonArr 去重之前的数组
 * @param  {String} field  需要去重的字段值
 * @return {Array}        去重之后的数组
 */
export function uniqueJsonArrByField(jsonArr, field) {
    // 数组长度小于2 或 没有指定去重字段 或 不是json格式数据
    if (jsonArr.length < 2 || !field || typeof jsonArr[0] !== "object") return jsonArr;
    let obj = {}; // 标识对象
    let uniqueArr = [];
    for(let i = 0; i<jsonArr.length; i++) { 
        if(!obj[jsonArr[i][field]]){ 
            uniqueArr.push(jsonArr[i]);
            obj[jsonArr[i][field]] = true;
        } 
    }
    return uniqueArr;
}

方法四 for + filter

/**
 * json数组去重
 * @param  {Array} jsonArr 去重之前的数组
 * @param  {String} field  需要去重的字段值
 * @return {Array}        去重之后的数组
 */
export function uniqueJsonArrByField(jsonArr, field) {
    // 数组长度小于2 或 没有指定去重字段 或 不是json格式数据
    if (jsonArr.length < 2 || !field || typeof jsonArr[0] !== "object") return jsonArr;
    let uniqueArr = [jsonArr[0]];
    for (let i = 1; i < jsonArr.length; i++) {
        let item = jsonArr[i];
        let filterData = uniqueArr.filter(function (f_item) {
            return item[field] && f_item[field] == item[field];
        });
        if (filterData.length == 0) { // 如果uniqueArr中不存在item
            uniqueArr.push(item);
        }
    }
    return uniqueArr;
}

方法五 for

/*
 * json数组去重
 * @param: {Array} jsonArr 去重之前的数组
 * @param  {String} field  需要去重的字段值
 * @return {Array}        去重之后的数组
 */
export function uniqueJsonArrByField(jsonArr, field) {
    // 数组长度小于2 或 没有指定去重字段 或 不是json格式数据
    if (jsonArr.length < 2 || !field || typeof jsonArr[0] !== "object") return jsonArr;
    let uniqueArr = [jsonArr[0]];
    for (let i = 1; i < jsonArr.length; i++) {
        let item = jsonArr[i];
        let repeat = false; // 标识位
        for (let j = 0; j < uniqueArr.length; j++) {
            if (item[field] && item[field] == uniqueArr[j][field]) {
                repeat = true;
                break;
            }
        }
        if (!repeat) {
            uniqueArr.push(item);
        }
    }
    return uniqueArr;
}

脑筋急转弯小程序抢先体验

请添加图片描述

程序员专属工具箱

请添加图片描述


✍创作不易,求关注😄,点赞👍,收藏⭐️