let obj =[
{
"SID": 123,
"EMPLOYEE_NAME": "Test123",
"EMPLOYEE_ID": 1
},
{
"SID": 543,
"EMPLOYEE_NAME": "Test1543",
"EMPLOYEE_ID": 2
},
{
"SID": 454,
"EMPLOYEE_NAME": "Test1454",
"EMPLOYEE_ID": 3
},
{
"SID": 789,
"EMPLOYEE_NAME": "Test1789",
"EMPLOYEE_ID": 4
},
{
"SID": 999,
"EMPLOYEE_NAME": "Test1999",
"EMPLOYEE_ID": 5
},
{
"SID": 555,
"EMPLOYEE_NAME": "Test1555",
"EMPLOYEE_ID": 6
},
]
let sidNumbers = "789,543,123";
function newArr(arr, obj){
let newwArr = [];
let splitArr = arr.split(',');
splitArr.reduce((curr, acc)=>{
if(`${acc['SID']}`.includes(curr))
{
newwArr.push(acc)
}
},obj)
return newwArr;
}
console.log(newArr(sidNumbers, obj));
the first output firstArray = [{
"SID": 789,
"EMPLOYEE_NAME": "Test1789",
"EMPLOYEE_ID": 4
},
{
"SID": 543,
"EMPLOYEE_NAME": "Test1543",
"EMPLOYEE_ID": 2
},
{
"SID": 123,
"EMPLOYEE_NAME": "Test123",
"EMPLOYEE_ID": 1
}
]
the output of secondArray =[
{
"SID": 454,
"EMPLOYEE_NAME": "Test1454",
"EMPLOYEE_ID": 3
},
{
"SID": 999,
"EMPLOYEE_NAME": "Test1999",
"EMPLOYEE_ID": 5
},
{
"SID": 555,
"EMPLOYEE_NAME": "Test1555",
"EMPLOYEE_ID": 6
},
]
我有一个对象数组和一串数字。正在尝试创建两个新的对象数组。第一,sidNumbers与obj匹配,它过滤返回一个对象数组,第二,sidNumbers与obj不匹配,它过滤返回一个对象数组。使用reduce是解决这个问题的最好方法吗?或者还有其他方法可以解决这个问题吗?
2条答案
按热度按时间vi4fp9gy1#
我建议你使用
filter
而不是reduce
来获得更清晰的代码。reduce的唯一优点是它只会遍历列表一次,只有当列表很大(比如,有几十万个元素)时,它才有用
在任何情况下,以下是如何使用
reduce
执行I:上面代码的注解:
[firstArray, secondArray] = ...
-这是解构赋值。这意味着我期望表达式的结果将是一个包含2个元素的数组,因此我将第一个元素赋给变量firstArray
,第二个赋给secondArray
。obj.reduce(([y,n], o) => ..., [[],[]])
-函数reduce
有两个参数。第一个是一个函数,第二个是初始值(在本例中,我使用一个包含2个空数组的数组作为初始值)。该函数必须接受2个输入参数:y
和n
obj
上迭代的当前对象o
sidNumbers.contains(o.SID)
-检查当前对象的属性SID
是否包含在sidNumbers
列表中。... ? [[...y, o],n] : [y,[...n, o]], [[],[]]
-这是三元条件运算符。如果条件返回true
,则函数将返回冒号:
之前的值,这只是将当前对象o
追加到数组y
中。如果为false,则将o
追加到第二个数组n
中。ttp71kqs2#
使用filter()和includes()代替reduce()。Reduce更适合于将元素修改为新数组。