gpt4 book ai didi

javascript - 在 javascript 中,如何构建一个比较值 A 和值 B 的方法

转载 作者:行者123 更新时间:2023-11-28 03:01:32 24 4
gpt4 key购买 nike

我有一个对象数组,如下所示:

var myArray = [
{ 'name' : 'some name', id: 23131, 'has' : ['dogs'] },
{ 'name' : 'some name 2', id: 8678, 'has' : ['dogs', 'cats'] },
{ 'name' : 'some name 3', id: 2125 , 'has' : ['donkeys', 'goats']},
{ 'name' : 'some name 4', id: 90867, 'has' : ['parrots', 'treasure'] },
{ 'name' : 'some name 5', id: 435458, 'has' : undefined },
];

我想检索符合特定条件的特定元素。例如,一个人的名字包含数字 5,id 为 435458。或者一个人有一只鹦鹉或一只山羊,或两者都有。

我尝试构建的方法需要两个参数,值 A 和值 B。值 A 是一个对象,例如 { 'name' : '5' }{ ' name' :/5/}{ 'name' : 5 } 或 { 'has' : 'goats' },值 B 是要匹配的对象,即 myArray.

该方法很快变得相当复杂,我觉得我的代码并没有达到应有的效果和效率。

我认为实现此目的的最佳方法是循环遍历传递和找到的对象和数组(myArrayhas数组),并调用它 self 直到只有两个字符串/数字/正则表达式值可供比较。但我不太确定如何最好地实现这一目标。或者这不是最好的方法?此外,速度也是一个重要的成功标准。

干杯

编辑:http://jsbin.com/ediye/edit包含我现在正在使用的函数,我认为它的工作原理如上所述,但对于大数据集来说它相当慢。

最佳答案

好的,我发现很多人对此感兴趣,所以这就是我目前所掌握的内容:

var filter = function(what,where) {
var sameArrays = function(arr,arr1) {
var al = arr.length, bl = arr1.length;
if (al !== bl || al === 0 || bl === 0) { return; }
for (var i = al - 1; i >= 0; i--){
if (!match(arr[i], arr1[i])) { return; }
}
return arr1;
};

var sameObjects = function(obj,obj1) {
for (var i in obj) {
if(!obj1.hasOwnProperty(i)){return;}
if (!match(obj[i],obj1[i])) {return;}
}
return obj1;
};

var inArray = function(value,obj) {
var r = [],
m = match;

for (var i = obj.length - 1; i >= 0; i--){
var item = obj[i];
if( m(value,item) ) {
r.push( item );
}
};

return (r.length) ? r : undefined ;
};

var inObject = function(value,obj) {
var r = [],
m = match;

for(var i in obj){
var item = obj[i];
if( m(value,item) ) {
r.push( item );
}
};

return (r.length) ? r : undefined ;
};

var inString = function(value,string) {
var valueConstructor = value.constructor;

if( valueConstructor === RegExp) {
return (value.test(string)) ? string : undefined ; }

else if( valueConstructor === Function && value(string) === true ) {
return string; }

};

var match = function(a,b) {
if(typeof a === 'undefined' || typeof b === 'undefined' || a === null || b === null) {
return; }

if (a == b) {
return b;}

var vc = a.constructor,
oc = b.constructor;

// Cannot compare array or object to a string or a number
if( (vc === Array || vc === Object) && (oc === String || oc === Number) ) {
return; }

if( oc === Array && vc === Array ) {
return sameArrays(a,b); }
else if(oc === Array) {
return inArray(a,b); }
else if (oc === Object && vc === Object) {
return sameObjects(a,b); }
else if (oc === Object) {
return inObject(a,b); }
else if (vc === Object || vc === Array) {
return; }
else if (oc === String || oc === Number){
return inString(a,b); }

};

return match(what,where);
};

它允许您执行以下操作:

var b = [
{ 'name' : 'some name', age: 23, id: 0, 'has' : ['dogs'] },
{ 'name' : 'some name 2', age:24, id: 1, 'has' : ['dogs', 'cats'] },
{ 'name' : 'some name 3', age: 25, id: 2 , 'has' : ['donkeys', 'goats']},
{ 'name' : 'some name 4', age:26, id: 3, 'has' : ['parrots', 'treasure'] },
{ 'name' : 'some name 5', age:27, id: 4, 'has' : undefined }
];

filter({ age:23 },b)

filter({ age:'24' },b)

filter({ name: /\d$/ },b)

filter('dogs',b)

filter({ has: 'goats' },b)

这是我一直在开发的某种 js 库的一部分,因此,如果您发现使用 json + dom,请尝试在 google 代码中搜索 jdatastore

关于javascript - 在 javascript 中,如何构建一个比较值 A 和值 B 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/561702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com