Js/Ts 数组的filter方法

背景

最近在写一个自动化生成/绑定/更新脚本的插件,有一个功能,我需要找出预制体/场景以及对应脚本中已有的属性,并且对属性进行对比,找出已经删除的属性和要添加属性。

实践

本来想着双层数组遍历,分别找出删除的和要添加的属性

let omitProps = [];
let deletedProps = [];
for (let i = 0; i < arrTsProps.length; i++) {
    let element = arrTsProps[i];
    if (arrPrefabProps.indexOf(element) === -1) {
        omitProps.push(element);
    }

}
for (let i = 0; i < arrPrefabProps.length; i++) {
    let element = arrPrefabProps[i];
    if (arrTsProps.indexOf(element) === -1) {
        deletedProps.push(element);
    }
}

btw,功能是实现了,这TM代码又臭又长,不能忍!

于是去查了一下文档,发现了这个神器 filter
菜鸟教程 JavaScript Array filter() 方法的介绍

菜鸟教程 JavaScript Array filter() 方法

直接上代码

// 预制体/场景上要添加的属性
let omitProps = arrTsProps.filter((element) => { if (arrPrefabProps.indexOf(element) === -1) { return element; } });
// 预制体/场景上已经删除的属性
let deletedProps = arrPrefabProps.filter((element) => { if (arrTsProps.indexOf(element) === -1) { return element; } });

这不就是我要找的嘛!

嗯,真香~

<think>嗯,用户想知道在TypeScript和Vue 3中如何定义数组变量。首先,我需要回忆一下Vue 3的响应式系统,特别是如何使用ref和reactive。记得在Vue 3中,响应式数据通常用ref或reactive来包裹,而TypeScript则需要类型注解来确保类型安全。 用户提到的数组,可能需要考虑不同类型的数组,比如基本类型数组或对象数组。比如,一个数字数组可以用ref来定义,类型应该是Ref<number[]>,这样在初始化时用ref<number[]>([])来声明。同时,如果数组元素是对象,可能需要更复杂的类型定义,比如interface来定义对象结构,然后使用PropType或者直接类型断言。 另外,用户提供的引用资料里提到使用PropType泛型来约束props中的对象类型,这可能对定义数组中的对象元素有帮助。不过,如果是响应式数据,可能需要用ref搭配泛型,或者在reactive中使用类型断言。 还要注意,当使用ref定义数组时,访问和修改需要.value,比如arr.value.push(1)。而如果是用reactive,可以直接操作数组方法,如arr.push(1),但需要确保类型正确。 可能需要分步骤说明:基本类型数组、对象数组、响应式数组的不同定义方式,以及注意事项,比如类型注解和.value的使用。同时,结合示例代码会更清晰,用户提供的引用中有一些代码示例,可以参考这些来构造回答。 还要检查是否有遗漏的情况,比如使用泛型接口或者联合类型的数组,是否需要特别处理。另外,计算属性返回数组的情况,可能需要用到computed,并指定返回类型为ComputedRef<Type[]>。 总结下来,回答应该包括使用ref和reactive两种方式定义数组,类型注解的方法,基本类型和对象数组的例子,以及注意事项如.value的使用和类型安全的重要性。</think>在 TypeScript 和 Vue 3 中定义数组变量需要结合响应式 API 和类型注解。以下是具体实现方法: ### 一、基础数组定义 1. **基本类型数组**(如数字、字符串): ```typescript import { ref } from 'vue'; // 显式声明数组类型 const numbers = ref<number[]>([]); // 初始化为空数组 const strings = ref<string[]>(['a', 'b']); ``` 这里通过泛型语法`<number[]>`明确指定数组元素类型为数字[^3] 2. **对象数组**: ```typescript interface User { id: number; name: string; } // 使用接口定义数组元素类型 const users = ref<User[]>([]); // 初始化为空对象数组 ``` ### 二、响应式数组操作 1. **修改数组**需通过`.value`访问: ```typescript numbers.value.push(1); // 添加元素 users.value = [{ id: 1, name: 'Alice' }]; // 重新赋值 ``` 2. **使用 reactive 定义数组**: ```typescript import { reactive } from 'vue'; const reactiveArray = reactive<string[]>(['vue', 'typescript']); reactiveArray.push('javascript'); // 直接操作无需.value ``` ### 三、特殊场景处理 1. **联合类型数组**: ```typescript const mixedArray = ref<(string | number)[]>(['text', 100]); ``` 2. **计算属性返回数组**: ```typescript import { computed, ComputedRef } from 'vue'; const filteredList: ComputedRef<User[]> = computed(() => { return users.value.filter(u => u.id > 10); }); ``` ### 四、最佳实践 - 始终使用类型注解确保数组元素类型安全 - 对象数组推荐先定义接口 - 修改`ref`数组时注意`.value`的使用 - 复杂场景可结合`PropType`(如组件 props 中的数组定义)[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值