js只保留数组对象的某个属性,合并公共类型的数据,选择树形结构的数据,并保留每个节点的name

news2024/12/27 10:31:05

嗨,今天周二了哎! 期待周五

文章目录

  • 一、js只保留数组对象的某个属性
  • 二、合并公共类型的数据
  • 二、选择树形结构的数据,并保留每个节点的name


一、js只保留数组对象的某个属性


  let data = [{ id: 1, name: '哈哈' }, { id: 2, name: '嘻嘻' }]
  let newData = []
  data.map(item => {
    newData.push(Object.assign({}, { name: item.name, }))
  })
  console.log(newData, 'pyq')

map 和 foreach 相似,但是map 有返回值

二、合并公共类型的数据

 let data = [
        {
          cost_name: "分检费",
          number: "12",
          unit: "吨",
          total_price: "60"
        },
        {
          cost_name: "冷冻费",
          number: "5",
          unit: "吨",
          total_price: "10"
        },
        {
          cost_name: "分检费",
          number: "6",
          unit: "吨",
          total_price: "30"
        },
        {
          cost_name: "冷冻费",
          number: "30",
          unit: "吨",
          total_price: "600"
        },
        {
          cost_name: "包装费",
          number: "12",
          unit: "吨",
          total_price: "100"
        }
      ];
 let newData = [
        {
          cost_name: "分检费",
          number: "18",
          unit: "吨",
          total_price: "90"
        },
        {
          cost_name: "冷冻费",
          number: "35",
          unit: "吨",
          total_price: "610"
        },
        {
          cost_name: "包装费",
          number: "12",
          unit: "吨",
          total_price: "100"
        }
      ];

我们的需求是将 data 的数据合并称 newData 的数据,先将数据按公共合并

	 先将数据扁平化
	  let arr = [];
      let obj = {};
      let objChild = {};
      data.forEach(item => {
        obj = {
          cost_name: item.cost_name,
          unit: item.unit,
          spend: []
        };
        objChild = {
          number: item.number,
          total_price: item.total_price
        };
        obj.spend.push(objChild);
        arr.push(obj);
      });
结果
 let data = [
        {
          cost_name: "分检费",
          unit: "吨",
          spend:[
				{ number: "12",total_price: "60" }
			]
        },
        {
          cost_name: "冷冻费",
          unit: "吨",
           spend:[
				{ number: "5",total_price: "10"}
			]       
        },
        {
          cost_name: "分检费",
          unit: "吨"
          spend:[
				{ number: "6",,total_price: "30"}
			]    
        },
        {
          cost_name: "冷冻费",
          unit: "吨",
          spend:[
				{ number: "30",total_price: "600"}
			]    
        },
        {
          cost_name: "包装费",
          unit: "吨",
          spend:[
				{ number: "12",total_price: "600"}
			]  
        }
      ];

我们的需求是将 数据 再次处理成为我们想要的结果

  	  let newData = [];
      let newObj = {};
      arr.forEach((el, i) => {
        if (!newObj[el.cost_name]) {
          // 循环遍历 arr 每一项,如果费用不存在,就将这个条数据添加至新数组里
          // 并且给 newObj 对象费用类别做个标记,下次再走这个费用类别时,说明存在就走另一个判断
          // {分检费:true,包装费:true,....} 
          newData.push(el);
          newObj[el.cost_name] = true;
        } else {
          // 在收集的新数据里,我们要用之前的数据和当前项判断
          // 找到相同项,添加至新的新数据项里
          newData.forEach(el2 => {
            if (el2.cost_name === arr[i].cost_name) {
              el2.spend = [...el2.spend, ...arr[i].spend]; // es6语法
            }
          });
        }
      });

二、选择树形结构的数据,并保留每个节点的name


在这里插入图片描述
在这里插入图片描述

最近做了一个功能,后端返回一个树形结构的数据,里面有很多节点,选中某个节点,需要保留它上级的name,大家也能想想到树形的数据,当前的 id 等于 上层的 pid, 要注意这个是很重要的 !!

  1. 扁平化数据,变成 [ { } , { } , { } , … ]
   flatTreeAndSetLevel(tree, level = 1) {
      // tree 要处理的树形数据
      // 遍历 tree 树形数据,如果存在子项(all_childer)就删了
      // 这是处理第一层,处理完毕,把第一层数据放到新的数组里
      // 
      // 对tree树形结构的子项进行处理,递归处理,先处理每层,先删除子项,并打个标记
      // 最后得到的数据 list = [{},{},{}...]
      const list = [];
      tree.forEach(item => {
        const o = JSON.parse(JSON.stringify(item));
        if (o.all_children) delete o.all_children;
        o.level = level;
        list.push(o);
        if (item.all_children && item.all_children.length) {
          list.push(...this.flatTreeAndSetLevel(item.all_children, level + 1));
        }
      });
      return list;
    },

在这里插入图片描述

  1. 对比找数据
	getParentAreas(pid, list) {
      // pid 是要对比的 id
      // list 是要对比的数据
      
      // 遍历整个 list 数据,如果找到 id = pid ,就把当前的pid 当作 id 继续递归对比,
      // 也是找父级的一个过程,最后这个数据为一个数组
      const target = [];
      const o = list.find(item => item.id == pid) || {};
      if (JSON.stringify(o) != "{}") target.push(o);
      if (o.pid) target.push(...this.getParentAreas(o.pid, list));
      return target;
    },

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/962681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ModaHub魔搭社区——大模型能力落地和核心就是应用场景

从今年3月百度率先发布语言大模型生成式AI产品“文心一言”后,各大科技互联网巨头纷纷入局,国内大模型瞬间遍地开花。包括阿里、华为、商汤科技、科大讯飞、360、腾讯等,纷纷推出各类大模型。 人工智能正在进入大规模落地应用关键期。 在IDC近日发布的《中国人工智能公有云…

本地虚机Jumpserver使用域名访问报错 使用IP+端口没有错误

背景: 我在本地Windows VMware 15的环境中部署了CentOS7.5,下载jumpserver-offline-installer-v2.28.1-amd64-138.tar.gz并安装部署。 需求: 1、能使用http:ip访问堡垒机。达成; 2、能使用http:域名访问堡垒机。达成&#xff…

FPGA时序分析与约束(2)——时序电路时序

一、前言 在之前的内容中,我们介绍了组合电路的时序问题和可能导致的毛刺,强烈推荐在阅读前文的基础上再继续阅读本文, 前文链接:FPGA时序分析与约束(1)——组合电路时序 这篇文章中,我们将继续…

Android安卓webview,网页端生成安卓项目(极速生成)教程

Android安卓webview,网页端生成安卓项目(极速生成)教程 一,前言 当自己做了一个PC端的页面,也就是前端的页面,或者已经上服的页面,但也想生成一个安卓端供用户使用,本教程详细讲解…

九种情况,要知道灵活变通

九种情况,要知道灵活变通 【安志强趣讲《孙子兵法》第27讲】 第八篇:九变 【全篇大白话】 战场千变万化,胜败看实力,还要看将帅的应变能力。 【原文】 孙子曰:凡用兵之法,将受命于君,合军聚众&a…

解决计算机视觉模型中的种族和性别偏见问题,Meta开源 FACET工具

Meta 公司最新推出的 FACET 工具是为了解决计算机视觉模型中存在的种族和性别偏见问题。该工具经过三万张图片的训练,并含有五万人的图像,特别强调了性别和肤色方面的感知能力。 通过评估计算机视觉模型在不同特征上的表现,FACET 工具可以回答…

vscode远程调试php

使用vscode远程调试php的方法 1.安装remote ssh插件 2.连接服务器 可以点击左下角的绿色按钮,或者ctrlshiftp打开命令框输入remote ssh应该也有。 3.在服务器端vscode安装php debug插件 4.安装xdebug xdebug是用来调试php的软件,原本和vscode没什么关…

无涯教程-JavaScript - GAMMADIST函数

GAMMADIST函数取代了Excel 2010中的GAMMA.DIST函数。 描述 该函数返回伽马分布。您可以使用此功能来研究可能具有偏斜分布的变量。伽马分布通常用于排队分析。 语法 GAMMADIST(x,alpha,beta,cumulative)争论 Argument描述Required/OptionalXThe value at which you want t…

Ubuntu18.04安装docker-io

1. 安装docker 1.1 网上一搜,全是更新仓库、下载依赖、添加docker的gpg密钥、添加docker仓库、安装docker-ce的步骤,但是在安装docker-ce时却提示“package "docker-ce" has no installation candidate”,就很迷。 1.2 安装docke…

设计模式-建造者(生成器)模式

文章目录 简介建造者模式的核心概念产品(Product)建造者(Builder)指挥者(Director)建造者模式与其他设计模式的关系工厂模式和建造者模式uml对比 建造者模式的实现步骤建造者模式的应用场景spring中应用 建…

【类与对象】②认识类的六个默认函数

文章目录 1.类的六个默认函数2.构造函数3.析构函数4.拷贝构造函数5.赋值运算符重载6.const成员 1.类的六个默认函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动…

算法通关村14关 | 数据流中位数问题

1. 数据流中位数问题 题目 LeetCode295: 中位数是有序列表中间的数,如果列表长度是偶数,中位数是中间两个数的平均值, 例如:[2,3,4]的中位数是3, [2,3]中位数是(23)/ 2 2.5 设计一个数据结构: …

使用python对光谱进行lorentz峰值拟合并作图(标注峰值点位)

承接: 使用python对光谱进行lorentz峰值拟合 接下来是对图象的处理,即作图。 import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit# 定义Lorentzian函数 def lorentzian(x, x0, A, gamma):return A * gamma**2…

外贸企业如何借助CRM提升企业发展?

外贸企业竞争激烈,提高自身竞争力,扩大海外业务市场,是每个外贸企业的目标。为了实现这一目标,不少外贸企业借助CRM系统,优化业务流程,管理维护客户,从而实现可持续发展。那么,外贸企…

git 忽略已经提交的文件或文件夹 (修改.gitignore文件无效)

场景描述:项目开发到一半,追加了模块,提交的时候未注意将不需要提交的文件或者目录提交到.gitignore,然后提交后发现再修改git配置文件已无法阻拦更新,查阅官方资料: 核心点:.gitignore 之前&a…

大数据之hadoop入门

大数据概念 大数据:无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现李和流程优化能力的海量、高增长率和多样化的信息资产。 大的概念是相对来说的:目前来说&#xff0…

基于51单片机的SHT11温湿度上下限LCD12864显示报警仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

51单片机SHT11温湿度上下限LCD12864显示报警仿真设计( proteus仿真程序原理图报告讲解视频) 讲解视频1.主要功能:2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&下载链接 51单片机SHT11温湿度上下限LCD12864显示报警仿真设计( proteus仿…

实现跨境电商测评和采退、LU卡、LU货最安全的系统方案

首先你要有一个稳定的测评环境系统,这个是做自养号退款、撸货、撸卡的基础。测评环境系统有很多,从早期的虚拟机,模拟机,云手机,VPS等等。这些系统方案先不说成本高,最重要的是成功率很低,所以一…

Git和Github的基本用法

目录 背景 下载安装 安装 git for windows 安装 tortoise git 使用 Github 创建项目 注册账号 创建项目 下载项目到本地 Git 操作的三板斧 放入代码 三板斧第一招: git add 三板斧第二招: git commit 三板斧第三招: git push 小结 🎈个人主页&#xf…

基于单片机的串行通信发射机设计

一、项目介绍 串行通信是一种常见的数据传输方式,允许将数据以比特流的形式在发送端和接收端之间传输。当前实现基于STC89C52单片机的串行通信发射机,通过红外发射管和接收头实现自定义协议的数据无线传输。 二、系统设计 2.1 单片机选择 在本设计中&…