- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 underscore-query这需要传入一个 JSON 对象来定义所有搜索子句。我需要通过一个从界面读取搜索值的循环来构建对象。我正处于获取所有搜索值的位置,但我需要将它们转换为查询子句格式。这是一个示例循环:
var filterArray = [];
var filterObject = {};
for (var key in $scope.mpsfilters) {
if ($scope.mpsfilters.hasOwnProperty(key)) {
var keyparts = key.split('_');
filterArray.push({
$and: {
"attribute_id": keyparts[0],
"type": keyparts[1],
"display_value": {$lte: $scope.mpsfilters[key].range_top, $gte: $scope.mpsfilters[key].range_bottom}
}
});
}
}
for (var i = 0; i < filterArray.length; i++) {
var filterStep = jQuery.extend({},filterObject, filterArray[i]);
filterObject = filterStep;
}
我需要的最终结果应该是这样的:
{
$and: {
"attribute_id": 2422,
"type": "max",
"display_value": {
$lte: 200,
$gte: 0.3
}
},
$and: {
"attribute_id": 2421,
"type": "typ",
"display_value": {
$lte: 150,
$gte: 50
}
}
$and: {
"attribute_id": 2750,
"type": "min",
"display_value": {
$lte: 17,
$gte: 2
}
}
}
我有两个问题使这个变得复杂:
使用jQuery.extend(), angular.extend()的所有例子,angular.merge()等只将两个对象合二为一,并且都分配了已知变量。在我的例子中,它需要是动态的,因为搜索变量的数量可能会有所不同。
我添加到主对象的每个对象基本上都具有相同的键“$and”。 extend() 和 merge()(merge 是 Angular 1.4 的新功能,它保留嵌套对象)函数只会更新同一个键,除非您传递一个空的 {} 对象作为第一个参数。这个最终对象将被传递到的过滤函数需要在我上面显示的结构中。
我的代码现在的结果是这样的:
{
$and: {
"attribute_id": 2750,
"type": "min",
"display_value": {
$lte: 17,
$gte: 2
}
}
}
它似乎是替换而不是附加。我怎样才能让它追加?
最佳答案
您当前编写的查询将始终返回 false。在没有组合修饰符的情况下,总是假设“和”(根据文档)。因此,您正在寻找 attribute_id
为 2422 和 2421 和 2750 的对象。
这在逻辑上是不可能的,所以我假设您的意思类似于以下内容(即使这仍然无效):
{
$or: {
$and: {
"attribute_id": 2422,
"type": "max",
"display_value": {
$lte: 200,
$gte: 0.3
}
},
$and: {
"attribute_id": 2421,
"type": "typ",
"display_value": {
$lte: 150,
$gte: 50
}
}
$and: {
"attribute_id": 2750,
"type": "min",
"display_value": {
$lte: 17,
$gte: 2
}
}
}
}
事实证明,即使文档从未这么说,代码实际上确实支持数组:
var models = [
{ x: 0, y: 0 },
{ x: 0, y: 1 },
{ x: 0, y: 2 },
{ x: 0, y: 3 },
{ x: 1, y: 0 },
{ x: 1, y: 1 },
{ x: 1, y: 2 },
{ x: 1, y: 3 }
];
var result = _.query( models, {
$or: [
{ $and: { x: 0, y: 1 } },
{ $and: { x: 1, y: 0 } }
]
});
console.log( result );
// result = [ { x: 0, y: 0 }, { x: 1, y: 0 } ]
<!-- No CDN for underscore-query -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script>(function(){var e,t,r,n,u,a,s,i,o,c,l,f,y,h,p,$,d,g,m,k,v,b,w,O,x,q,j=[].slice,E=[].indexOf||function(e){for(var t=0,r=this.length;r>t;t++)if(t in this&&this[t]===e)return t;return-1},A={}.hasOwnProperty;for($=this,w={},b=function(){var e;return e={},["every","some","filter","reduce","map"].forEach(function(t){return e[t]=function(){var e,r;return r=arguments[0],e=2<=arguments.length?j.call(arguments,1):[],r[t].apply(r,e)}}),e.keys=Object.keys,e.isArray=Array.isArray,e.result=function(e,t){return null==e&&(e={}),"Function"===w.getType(e[t])?e[t]():e[t]},e.detect=function(e,t){var r,n,u;for(n=0,u=e.length;u>n;n++)if(r=e[n],t(r))return r},e.reject=function(e,t){var r,n,u,a;for(a=[],n=0,u=e.length;u>n;n++)r=e[n],t(r)||a.push(r);return a},e.intersection=function(e,t){var r,n,u,a;for(a=[],n=0,u=e.length;u>n;n++)r=e[n],-1!==t.indexOf(r)&&a.push(r);return a},e.isEqual=function(e,t){return JSON.stringify(e)===JSON.stringify(t)},e},n=function(e){var t,r,n,u;for(u=["every","some","filter","detect","reject","reduce","intersection","isEqual","keys","isArray","result","map"],r=0,n=u.length;n>r;r++)if(t=u[r],w[t]=e[t],!w[t])throw new Error(""+t+" missing. Please ensure that you first initialize underscore-query with either lodash or underscore")},w.getType=function(e){var t;return t=Object.prototype.toString.call(e).substr(8),t.substr(0,t.length-1)},w.makeObj=function(e,t){var r;return(r={})[e]=t,r},w.reverseString=function(e){return e.toLowerCase().split("").reverse().join("")},w.compoundKeys=["$and","$not","$or","$nor"],w.makeGetter=function(e){return e=e.split("."),function(t){var r,n,u,a;for(n=t,u=0,a=e.length;a>u;u++)r=e[u],n&&(n=w.result(n,r));return n}},o=function(e,t){var r,n,u;u=[];for(r in t)n=t[r],u.push(w.makeObj(e,w.makeObj(r,n)));return u},l=function(e){var t,r,n,u,a,s;switch(t=w.keys(e)[0],u=e[t],r={key:t},(null!=u?u.$boost:void 0)&&(r.boost=u.$boost,delete u.$boost),-1!==t.indexOf(".")&&(r.getter=w.makeGetter(t)),n=w.getType(u)){case"RegExp":case"Date":r.type="$"+n.toLowerCase(),r.value=u;break;case"Object":if(E.call(w.compoundKeys,t)>=0)r.type=t,r.value=y(u),r.key=null;else if(w.keys(u).length>1)r.type="$and",r.value=y(o(t,u)),r.key=null;else for(a in u)if(A.call(u,a)){if(s=u[a],!v(a,s))throw new Error("Query value ("+s+") doesn't match query type: ("+a+")");switch(r.type=a,a){case"$elemMatch":r.value=m(f(s));break;case"$endsWith":r.value=w.reverseString(s);break;case"$likeI":case"$startsWith":r.value=s.toLowerCase();break;case"$not":case"$nor":case"$or":case"$and":r.value=y(w.makeObj(r.key,s)),r.key=null;break;case"$computed":r=l(w.makeObj(t,s)),r.getter=w.makeGetter(t);break;default:r.value=s}}break;default:r.type="$equal",r.value=u}return"$equal"!==r.type||"Object"!==n&&"Array"!==n||(r.type="$deepEqual"),r},y=function(e){var t,r,n,u,a,s,i;for(n=w.isArray(e)?e:function(){var r;r=[];for(t in e)A.call(e,t)&&(u=e[t],r.push(w.makeObj(t,u)));return r}(),i=[],a=0,s=n.length;s>a;a++)r=n[a],i.push(l(r));return i},v=function(e,t){var r;switch(r=w.getType(t),e){case"$in":case"$nin":case"$all":case"$any":return"Array"===r;case"$size":return"Number"===r;case"$regex":case"$regexp":return"RegExp"===r;case"$like":case"$likeI":return"String"===r;case"$between":case"$mod":return"Array"===r&&2===t.length;case"$cb":return"Function"===r;default:return!0}},k=function(e,t){var r;switch(r=w.getType(t),e){case"$like":case"$likeI":case"$regex":case"$startsWith":case"$endsWith":return"String"===r;case"$contains":case"$all":case"$any":case"$elemMatch":return"Array"===r;case"$size":return"String"===r||"Array"===r;case"$in":case"$nin":return null!=t;default:return!0}},h=function(e,t,r,n,u){switch(e){case"$equal":return w.isArray(r)?E.call(r,t)>=0:r===t;case"$deepEqual":return w.isEqual(r,t);case"$contains":return E.call(r,t)>=0;case"$ne":return r!==t;case"$lt":return t>r;case"$gt":return r>t;case"$lte":return t>=r;case"$gte":return r>=t;case"$between":return t[0]<r&&r<t[1];case"$betweene":return t[0]<=r&&r<=t[1];case"$in":return E.call(t,r)>=0;case"$nin":return E.call(t,r)<0;case"$all":return w.every(t,function(e){return E.call(r,e)>=0});case"$any":return w.some(r,function(e){return E.call(t,e)>=0});case"$size":return r.length===t;case"$exists":case"$has":return null!=r===t;case"$like":return-1!==r.indexOf(t);case"$likeI":return-1!==r.toLowerCase().indexOf(t);case"$startsWith":return 0===r.toLowerCase().indexOf(t);case"$endsWith":return 0===w.reverseString(r).indexOf(t);case"$type":return typeof r===t;case"$regex":case"$regexp":return t.test(r);case"$cb":return t.call(n,r);case"$mod":return r%t[0]===t[1];case"$elemMatch":return d(r,t,null,!0);case"$and":case"$or":case"$nor":case"$not":return p(e,t,u,n);default:return!1}},m=function(e,t,r){var n,u;if("String"===w.getType(t)&&(n=t,t=function(e,t){return e[n](t)}),r){if(1!==e.length)throw new Error("score operations currently don't work on compound queries");if(u=e[0],"$and"!==u.type)throw new Error("score operations only work on $and queries (not "+u.type);return function(e){return e._score=p(u.type,u.parsedQuery,t,e,!0),e}}return function(n){var a,s;for(a=0,s=e.length;s>a;a++)if(u=e[a],!p(u.type,u.parsedQuery,t,n,r))return!1;return!0}},p=function(e,t,r,n,u){var a,s,i,o,c,l,f,y,p,$;for(i=0,c=0,l=1/t.length,y=0,p=t.length;p>y;y++)switch(o=t[y],a=o.getter?o.getter(n,o.key):r?r(n,o.key):n[o.key],f=k(o.type,a),f&&(f=h(o.type,o.value,a,n,r)),f&&(i++,u&&(s=null!=($=o.boost)?$:1,c+=l*s)),e){case"$and":if(!u&&!f)return!1;break;case"$not":if(f)return!1;break;case"$or":if(f)return!0;break;case"$nor":if(f)return!1;break;default:throw new Error("Invalid compound method")}return u?c:"$not"===e?0===i:"$or"!==e},f=function(e){var t,r,n,u,a;if(n=w.keys(e),!n.length)return[];if(t=w.intersection(w.compoundKeys,n),0===t.length)return[{type:"$and",parsedQuery:y(e)}];if(t.length!==n.length){E.call(t,"$and")<0&&(e.$and={},t.unshift("$and"));for(r in e)A.call(e,r)&&(a=e[r],E.call(w.compoundKeys,r)<0&&(e.$and[r]=a,delete e[r]))}return function(){var r,n,a;for(a=[],r=0,n=t.length;n>r;r++)u=t[r],a.push({type:u,parsedQuery:y(e[u])});return a}()},c=function(e){var t;return"String"===w.getType(e)&&(t=e,e=function(e,r){return e[t](r)}),e},e=function(){function e(e,t){this.items=e,this._getter=t,this.theQuery={}}return e.prototype.all=function(e,t){return e&&(this.items=e),e=this.indexes?this.getIndexedItems(this.items):this.items,d(e,this.theQuery,this._getter,t)},e.prototype.chain=function(){return _.chain(this.all.apply(this,arguments))},e.prototype.tester=function(){return i(this.theQuery,this._getter)},e.prototype.first=function(e){return this.all(e,!0)},e.prototype.getter=function(e){return this._getter=e,this},e}(),t=function(e){return function(t,r){var n;return r&&(t=w.makeObj(t,r)),null==(n=this.theQuery)[e]&&(n[e]=[]),this.theQuery[e].push(t),this}},q=w.compoundKeys,O=0,x=q.length;x>O;O++)s=q[O],e.prototype[s.substr(1)]=t(s);return e.prototype.find=e.prototype.query=e.prototype.run=e.prototype.all,r=function(t,r){return new e(t,r)},i=function(e,t){return m(f(e),c(t))},a=function(e,t,r){return d(e,t,r,!0)},d=function(e,t,n,u,a){var s;return arguments.length<2?r.apply(this,arguments):(n&&(n=c(n)),"Function"!==w.getType(t)&&(t=m(f(t),n,a)),(s=a?w.map:u?w.detect:w.filter)(e,t))},g=function(e,t,r){return d(e,t,r,!1,!0)},d.build=r,d.parse=f,d.findOne=d.first=a,d.score=g,d.tester=d.testWith=i,d.getter=d.pluckWith=w.makeGetter,u=function(e,t){return null==t&&(t=!0),e||(e=b(),t=!1),n(e),t&&e.mixin({query:d,q:d}),d},$._?u($._):exports&&("undefined"!=typeof module&&null!==module?module.exports:void 0)?module.exports=u:u}).call(this);</script>
所以你实际上可以这样写你的查询:
{
$or: [
{ $and: {
"attribute_id": 2422,
"type": "max",
"display_value": {
$lte: 200,
$gte: 0.3
}
} },
{ $and: {
"attribute_id": 2421,
"type": "typ",
"display_value": {
$lte: 150,
$gte: 50
}
} },
{ $and: {
"attribute_id": 2750,
"type": "min",
"display_value": {
$lte: 17,
$gte: 2
}
} }
]
}
这将使您的函数大大更简单:
var filterArray = [];
var filterObject = {};
for (var key in $scope.mpsfilters) {
if ($scope.mpsfilters.hasOwnProperty(key)) {
var keyparts = key.split('_');
filterArray.push({ $and: {
"attribute_id": keyparts[0],
"type": keyparts[1],
"display_value": {$lte: $scope.mpsfilters[key].range_top, $gte: $scope.mpsfilters[key].range_bottom}
}});
}
}
// look how much easier this is!
filterObject = { $or: filterArray };
关于javascript - 如何以编程方式将对象添加到键相同的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29663714/
我一直在阅读有关汇编函数的内容,但对于是使用进入和退出还是仅使用调用/返回指令来快速执行,我感到很困惑。一种方式快而另一种方式更小吗?例如,在不内联函数的情况下,在汇编中执行此操作的最快(stdcal
我正在处理一个元组列表,如下所示: res = [('stori', 'JJ'), ('man', 'NN'), ('unnatur', 'JJ'), ('feel', 'NN'), ('pig',
最近我一直在做很多网络或 IO 绑定(bind)操作,使用线程有助于加快代码速度。我注意到我一直在一遍又一遍地编写这样的代码: threads = [] for machine, user, data
假设我有一个名为 user_stats 的资源,其中包含用户拥有的帖子、评论、喜欢和关注者的数量。是否有一种 RESTful 方式只询问该统计数据的一部分(即,对于 user_stats/3,请告诉我
我有一个简单的 api,它的工作原理是这样的: 用户创建一个请求 ( POST /requests ) 另一个用户检索所有请求 ( GET /requests ) 然后向请求添加报价 ( POST /
考虑以下 CDK Python 中的示例(对于这个问题,不需要 AWS 知识,这应该对基本上任何构建器模式都有效,我只是在这个示例中使用 CDK,因为我使用这个库遇到了这个问题。): from aws
Scala 中管理对象池的首选方法是什么? 我需要单线程创建和删除大规模对象(不需要同步)。在 C++ 中,我使用了静态对象数组。 在 Scala 中处理它的惯用和有效方法是什么? 最佳答案 我会把它
我有一个带有一些内置方法的类。这是该类的抽象示例: class Foo: def __init__(self): self.a = 0 self.b = 0
返回和检查方法执行的 Pythonic 方式 我目前在 python 代码中使用 golang 编码风格,决定移动 pythonic 方式 例子: import sys from typing imp
我正在开发一个 RESTful API。其中一个 URL 允许调用者通过 id 请求特定人员的记录。 返回该 id 不存在的记录的常规值是什么?服务器是否应该发回一个空对象或者一个 404,或者其他什
我正在使用 pathlib.Path() 检查文件是否存在,并使用 rasterio 将其作为图像打开. filename = pathlib.Path("./my_file-name.tif") 但
我正在寻找一种 Pythonic 方式来从列表和字典创建嵌套字典。以下两个语句产生相同的结果: a = [3, 4] b = {'a': 1, 'b': 2} c = dict(zip(b, a))
我有一个正在操裁剪理设备的脚本。设备有时会发生物理故障,当它发生时,我想重置设备并继续执行脚本。我有这个: while True: do_device_control() device
做组合别名的最pythonic和正确的方法是什么? 这是一个假设的场景: class House: def cleanup(self, arg1, arg2, kwarg1=False):
我正在开发一个小型客户端服务器程序来收集订单。我想以“REST(ful)方式”来做到这一点。 我想做的是: 收集所有订单行(产品和数量)并将完整订单发送到服务器 目前我看到有两种选择: 将每个订单行发
我知道在 Groovy 中您可以使用字符串调用类/对象上的方法。例如: Foo."get"(1) /* or */ String meth = "get" Foo."$meth"(1) 有没有办法
在 ECMAScript6 中,您可以使用扩展运算符来解构这样的对象 const {a, ...rest} = obj; 它将 obj 浅拷贝到 rest,不带属性 a。 有没有一种干净的方法可以在
我有几个函数返回数字或None。我希望我的包装函数返回第一个不是 None 的结果。除了下面的方法之外,还有其他方法吗? def func1(): return None def func2(
假设我想设计一个 REST api 来讨论歌曲、专辑和艺术家(实际上我就是这样做的,就像我之前的 1312414 个人一样)。 歌曲资源始终与其所属专辑相关联。相反,专辑资源与其包含的所有歌曲相关联。
这是我认为必须经常出现的问题,但我一直无法找到一个好的解决方案。假设我有一个函数,它可以作为参数传递一个开放资源(如文件或数据库连接对象),或者需要自己创建一个。如果函数需要自己打开文件,最佳实践通常
我是一名优秀的程序员,十分优秀!