javascript 尝试使用reduce创建两个新的对象数组,但没有得到输出

q5iwbnjs  于 2023-04-28  发布在  Java
关注(0)|答案(2)|浏览(108)
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是解决这个问题的最好方法吗?或者还有其他方法可以解决这个问题吗?

vi4fp9gy

vi4fp9gy1#

我建议你使用filter而不是reduce来获得更清晰的代码。
reduce的唯一优点是它只会遍历列表一次,只有当列表很大(比如,有几十万个元素)时,它才有用
在任何情况下,以下是如何使用reduce执行I:

[firstArray, secondArray] = obj.reduce(
  ([y,n], o) => sidNumbers.contains(o.SID) ? [[...y, o],n] : [y,[...n, o]], [[],[]])

上面代码的注解:

  • [firstArray, secondArray] = ...-这是解构赋值。这意味着我期望表达式的结果将是一个包含2个元素的数组,因此我将第一个元素赋给变量firstArray,第二个赋给secondArray
  • obj.reduce(([y,n], o) => ..., [[],[]])-函数reduce有两个参数。第一个是一个函数,第二个是初始值(在本例中,我使用一个包含2个空数组的数组作为初始值)。该函数必须接受2个输入参数:
  • 到目前为止累积的聚合(我知道它总是一个包含2个元素的数组,所以我将它们分解为2个变量yn
  • obj上迭代的当前对象o
  • sidNumbers.contains(o.SID)-检查当前对象的属性SID是否包含在sidNumbers列表中。
  • ... ? [[...y, o],n] : [y,[...n, o]], [[],[]]-这是三元条件运算符。如果条件返回true,则函数将返回冒号:之前的值,这只是将当前对象o追加到数组y中。如果为false,则将o追加到第二个数组n中。
  • 最后,在迭代原始列表之后,条件为真的所有元素(i.第一阵列(即,它们的SID包含在参考列表中)将被聚合在第一阵列中,而其他的则被聚合在第二阵列上。
ttp71kqs

ttp71kqs2#

使用filter()和includes()代替reduce()。Reduce更适合于将元素修改为新数组。

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
    },
    ]

const filterObjectsBySID = (obj, sidNumbers) =>
  [obj.filter(({ SID }) => sidNumbers.includes(SID.toString())),
  obj.filter(({ SID }) => !sidNumbers.includes(SID.toString()))];

const sidNumbers = "789,543,123";

const [matchingObjects, nonMatchingObjects] = filterObjectsBySID(obj, sidNumbers);

console.log(matchingObjects);
console.log(nonMatchingObjects);

相关问题