首页 > 解决方案 > 哪个是查找 Item 的好方法 - 对象或对象数组中的多个属性?

问题描述

哪个函数更适合通过getDoneDataOne或查找项目getDoneDataTwo?两种方法都是通过 Reduce 计算并创建一个数组或对象(不包括这些逻辑)

例如getDoneDataOne()ProductId 的多个属性:

function getDoneDataOne() {
    return { 
        '111': { Name: 'Item One', TotalDone: 3 },
        '222': { Name: 'Item Two', TotalDone: 3 },
        '333': { Name: 'Item Three', TotalDone: 1 } 
    }
}

例如getDoneDataTwo()- 返回对象数组:

function getDoneDataTwo() {
    return [
        { ProductId: 111, Name: 'Item One', TotalDone: 3 },
        { ProductId: 222, Name: 'Item Two', TotalDone: 3 },
        { ProductId: 333, Name: 'Item Three', TotalDone: 1 } 
    ]
}

搜索项目首选哪种返回格式?

它遍历Batch对象并通过以下方式找到一个项目doneData

选项1:

这是查找项目的正确实现吗?

const doneDataOne = getDoneDataOne();
Batch.Products.forEach(batchProduct => {
    batchProductId = batchProduct.ProductId;

    if (doneDataOne[batchProductId]) { //Is this correct way?
        console.log(doneDataOne[batchProductId]);
    }
});

选项 2:

const doneDataTwo = getDoneDataTwo();
Batch.Products.forEach(batchProduct => {
    product = doneDataTwo.find(doneDataTwo => doneDataTwo.ProductId == batchProduct.ProductId);

    if (product) { 
        console.log(product);
    }
});

还是有其他更好的方法?

演示:

const Batch = {
  Products: [{ ProductId: 222 }, { ProductId: 666 }, { ProductId: 333 }]
};

function getDoneDataOne() {
    return { 
        '111': { Name: 'Item One', TotalDone: 3 },
        '222': { Name: 'Item Two', TotalDone: 3 },
        '333': { Name: 'Item Three', TotalDone: 1 } 
    }
}

function getDoneDataTwo() {
    return [
        { ProductId: 111, Name: 'Item One', TotalDone: 3 },
        { ProductId: 222, Name: 'Item Two', TotalDone: 3 },
        { ProductId: 333, Name: 'Item Three', TotalDone: 1 } 
    ]
}

// Example 1
const doneDataOne = getDoneDataOne();
Batch.Products.forEach(product => {
    batchProductId = product.ProductId;

    if (doneDataOne[batchProductId]) { //Is this correct way?
        console.log(doneDataOne[batchProductId]);
    }
});

// Example 2
const doneDataTwo = getDoneDataTwo();
Batch.Products.forEach(batchProduct => {
    product = doneDataTwo.find(doneDataTwo => doneDataTwo.ProductId == batchProduct.ProductId);

    if (product) { 
        console.log(product);
    }
});
 

标签: javascriptnode.js

解决方案


我认为这在很大程度上取决于您将如何处理结果数据。

如果您知道您将通过已知 id 访问单个项目,那么使用对象并将 id 用作键会更方便,例如var item = data[id];这样您就不必遍历或过滤数组来访问项目.

例如,如果您需要对数据进行排序,数组将有助于实现这一点。

如果不确切知道你在用数据做什么,很难说一个肯定比另一个更好,两者都有自己的位置。


推荐阅读