避免重复密钥/数据

时间:2017-05-10 10:32:44

标签: javascript

我对JS中的一些现有代码感到厌烦。代码正在运行,所以我没有急于改变它,但下面显示的重复确实让我烦恼。避免这种情况的通常/推荐/官方方式是什么?

实际的系统是一个庞大/复杂的金融系统,所以我把它简化为证明问题的最基本的例子:

var colours={
     red:{id:"red", vals:[1,0,0]},
       green:{id:"green", vals:[0,1,0]},
       grey:{id:"grey", vals:[0.5,0.5,0.5]}
 // ...etc
    };

// id needs to be known internally within the object - thus it is defined as a property.
// e.g:
colour.prototype.identify(console.log(this.id));

// id also needs to be used externally to find an object quickly.
// e.g:
function getcolour(s){return colours[s];}

// Although this works. It does mean duplicating data, with the theoretical possibility of a mismatch:
var colours={//...
      blue:{id:"green", // oh dear...

如何通常由专家处理?

3 个答案:

答案 0 :(得分:1)

我不会改变颜色[key]直接访问其他方法以避免重复。 任何其他尝试都将导致处理,并且您已经提到过您有大量数据。

我认为复制是在传入的数据上进行的,这是一种浪费。 通过网络数据消费处理的示例可以是,遍历地图对象并根据密钥动态地设置id。 (处理与流量)

colours[key].id = key

答案 1 :(得分:1)

这个问题有些主观。

创建应用程序时,我通常会尝试执行以下操作:

  • 从不在多个地方定义相同的数据。来源应该始终是明确的
  • 如果我需要创建任何索引以便更快/更容易访问,我使用实用程序方法来执行此操作。那些方法应该进行适当的单元测试,这样我就不会怀疑他们做错了什么
  • 尽可能多地使用第三方库(例如已经建议的lodash或下划线),以尽量减少要编写/维护的代码量。

如果您的算法和实用程序经过适当的单元测试,您不必担心(过多)将数据置于不一致状态。但是,如果这些是非常重要的系统/接口,您可以在输出上添加一些验证。在输入上进行数据验证和编组通常是一种很好的做法。

实用方法说明:  如果您有数据数组,请说

var data = [{"id":"i_1", ...}, {"id":"i_2", ...},{"id":"i_3",....}];

然后你必须创建一个索引或者根据原始数组创建更多数据集,然后你自己创建一个实用程序方法库,对数组进行修改,创建派生数据集或迭代数组并动态创建结果项。例如:

var createIndex = function( arr ){
    // do something that converts the data array with expected structure to object
    // { 
    //     i_1: {"id":"i_1", ...},
    //     i_2: {"id":"i_2", ...},
    //     i_3: {"id":"i_3", ...}
    return newObj;
}

此方法将创建一个哈希映射来访问您的数据,这比一直迭代原始数组更快。但是现在,您可以轻松地对此方法进行单元测试,并确保在源数据上使用它来获取预期的数据集时,不会出现任何不一致。

答案 2 :(得分:1)

您可以过滤对象,将其转换为对象数组,然后过滤唯一值。将其转换为数组可以让您更快速,更轻松地执行大量操作。

因此,您可以将对象映射到数组:

var coloursArray = myObj.map(function(value, index) {
    return [value];
});

删除重复项:

function removeDuplicates() {
    return coloursArray.filter((obj, pos, arr) => {
        return arr.map(mapObj => mapObj[id]).indexOf(obj[id]) === pos;
    });
}

您可以通过.uniq method使用例如underscore.js从数组中删除重复项:

var uniqueColoursArray = _.uniq(coloursArray , function(c){ return c.id; });

此外,此功能非常无用,因为您可以直接访问您的元素:

function getcolour(s){return colours[s];}

致电colours[s]它也比getcolour(s)短。如果你也传递了数组,那么你的函数会有意义,因为它在某些其他范围内是不可访问的。

然后我无法理解为什么你在这里传递一个console.log作为参数:

colour.prototype.identify(console.log(this.id));

也许您只想传递this.id