Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何减少这种比较循环_Javascript_Loops_Comparison - Fatal编程技术网

Javascript 如何减少这种比较循环

Javascript 如何减少这种比较循环,javascript,loops,comparison,Javascript,Loops,Comparison,我需要找出与用户相比,s.data中缺少哪些id号。 有没有更好(更小的代码)的比较方法 谢谢;) if(users.length!=未定义) { 对于(y=0;yFirst,off),第二个分支似乎只是第一个分支的一个特化。您可以使用它使“第二个”users=[users](在这种情况下,users实际上是指用户而不是一个用户),并完全删除顶部分支,或者将逻辑删除到每个用户调用的函数中 现在,来处理内部循环:这是一个“映射”和一个“包含”。仅从包含的角度来看它: // Returns true

我需要找出与用户相比,s.data中缺少哪些id号。 有没有更好(更小的代码)的比较方法

谢谢;)

if(users.length!=未定义)
{

对于(y=0;yFirst,off),第二个分支似乎只是第一个分支的一个特化。您可以使用它使“第二个”
users=[users]
(在这种情况下,users实际上是指用户而不是一个用户),并完全删除顶部分支,或者将逻辑删除到每个用户调用的函数中

现在,来处理内部循环:这是一个“映射”和一个“包含”。仅从包含的角度来看它:

// Returns true if any item in data.client_id (an array)
// is that of user.client_id
function dataContains (user, data) {
  for (var i = 0; i < data.length; i++) {
    if (data[i].client_id == user.client_id) {
      return true
    }
  }
  return false
}
但是,如果我们还有一个“映射”,我们可以更进一步,使用一个通用的“包含”。最终形式是:

var dataIds = map(data, function (x) { return x.client_id })
for (each user) {
  if (!contains(user.client_id, dataIds)) {
    ..
  }
}
其中“包含”更一般化:

// Returns true iff item is contained within arr
function contains (item, arr) {
  // Just do what the comment documentation says
}
如果您使用的是jQuery,那么您已经有了方便的功能: 'contains'-,以及一个“sorta”'map'。但是,请注意!jQuery'map'实际上是一个平面映射,其名称不正确,文档不完整

我相信ECMAScript ED5具有这些标准函数

此外,您可以将数据中的客户机id反转为对象密钥,并简单地测试密钥是否存在,即O(1)对O(n),如果查找只建立一次(或者至少比使用的要少很多),那么它可能是“理论上”的更好。如果n的大小真的很重要的话,那么它会产生很大的差异。在这种情况下,很可能会以增量的方式构建查找,并在执行此代码的两次之间保存

var existingIds = {}
for (var i = 0; i < data.length; i++) {
  existingIds[data[i].client_id] = true
}
for (each user) {
  if (!existingIds[user.client_id]) {
    ..
  }
}
var existingIds={}
对于(变量i=0;i
首先,关闭,第二个分支看起来只不过是第一个分支的专门化。您可以使用它使“第二个”
users=[users]
(在这种情况下,users实际上是指用户而不是a-user),并完全删除顶部分支,或者将逻辑删除到每个用户调用的函数中

现在,来处理内部循环:这是一个“映射”和一个“包含”。仅从包含的角度来看它:

// Returns true if any item in data.client_id (an array)
// is that of user.client_id
function dataContains (user, data) {
  for (var i = 0; i < data.length; i++) {
    if (data[i].client_id == user.client_id) {
      return true
    }
  }
  return false
}
但是,如果我们还有一个“映射”,我们可以更进一步,使用一个通用的“包含”。最终形式是:

var dataIds = map(data, function (x) { return x.client_id })
for (each user) {
  if (!contains(user.client_id, dataIds)) {
    ..
  }
}
其中“包含”更一般化:

// Returns true iff item is contained within arr
function contains (item, arr) {
  // Just do what the comment documentation says
}
如果您使用的是jQuery,那么您已经有了方便的功能: 'contains'-,以及一个“sorta”'map'。但是,请注意!jQuery'map'实际上是一个平面映射,其名称不正确,文档不完整

我相信ECMAScript ED5具有这些标准函数

此外,您可以将数据中的客户机id反转为对象密钥,并简单地测试密钥是否存在,即O(1)对O(n),如果查找只建立一次(或者至少比使用的要少很多),那么它可能是“理论上”的更好。如果n的大小真的很重要的话,那么它会产生很大的差异。在这种情况下,很可能会以增量的方式构建查找,并在执行此代码的两次之间保存

var existingIds = {}
for (var i = 0; i < data.length; i++) {
  existingIds[data[i].client_id] = true
}
for (each user) {
  if (!existingIds[user.client_id]) {
    ..
  }
}
var existingIds={}
对于(变量i=0;i
似乎根本不能满足您的要求。此外,代码越短并不意味着代码越好。时间复杂度或内存要求越低,代码越好。@Dustin Fineout在我的书中,较低的代码复杂度通常意味着“更好”的代码…(除非存在已知的性能问题,否则我不关心其他问题:-)该死的,我需要从s.data中不存在的用户那里获取客户端id号。或者我工作时间太长,或者我很笨。:我关心性能,我的客户端似乎也很关心。似乎根本不做你所说的。而且,代码越短并不意味着代码越好。时间复杂度或内存要求越低,代码越好。@DustinFineout在我的书中,较低的代码复杂度通常意味着“更好的”代码…(除非存在已知的性能问题,否则我不关心其他问题:-)该死,我需要从s.data中不存在的用户那里获取客户端id号。或者我工作时间太长,或者我很笨。:我关心性能,我的客户端似乎也很关心。谢谢,伙计!这就是我所说的一个很好的答案!太糟糕了,我只能添加1+:)谢谢,伙计!这就是我所说的一个极好的答案!太糟糕了,我只能添加1+:)