Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 3

12
votes
answers
30 views
+10

JavaScript地图和查找同时:findMap?

如果不使用for循环,如何重写它?

  const a = [2,5,78,4]; const expensiveFunction = n => 2 * n; 结果; //找到第一个数字(let i = 0; i< a.length; i ++){const r = expensiveFunction(a [i]); if(r> 100){result = r; 打破; console.log(result);   

我天真的方法:

  const result = a.map(expensiveFunction).find(x => x> 100); 的console.log(结果);   

但是这会在所有元素上运行 expensiveFunction ,我想避免这些。在上面的例子中,我们应该避免运行 expensiveFunction(4)

有些语言有

沙发
+50
+50

内置 map 是贪婪的,所以你必须编写自己的懒人版本:

  const a = [2,5,78,4]; const expensiveFunction = n => {console.log('expensiveFunction for',n); 返回2 * n}; function * map(a,fn){for(let x of a)yield fn(x); 函数find(a,fn){for(let x of a)if(fn(x))返回x; } r = find(map(a,expensiveFunction),x => x> 100)console.log('result',r)    

与stock map 不同,此 map 是一个生成器,可根据需要返回(产生)结果,而不是一次处理整个数组。此示例中的 find map 是“coroutines”并播放某种乒乓游戏,其中 find 请求结果和地图在被问到时提供它们。一旦 find 对它得到的东西感到满意,它就会退出, map 也会退出,因为没有人再要求它的结果了。

你可以还要将 map find 和朋友添加到 IteratorPrototype 使它们可用于所有迭代器并能够使用点表示法:

  const IteratorPrototype = Object.getPrototypeOf( Object.getPrototypeOf([] [Symbol.iterator]())); Object.defineProperties(IteratorPrototype,{map:{value:function *(fn){for(let x of this){yield fn(x);}},enumerable:false},find:{value:function(fn){ for(let x of this){if(fn(x))return x;}},enumerable:false},}); // const a = [2,5,78,4]; const expensiveFunction = n => {console.log('expensiveFunction',n); 返回2 * n}; 设r = a.values()。map(expensiveFunction).find(x => x> 100); console.log(r)    

实际上,我非常喜欢这个想法,即基于它编写了一个完整的库: https://github.com/gebrkn/armita

我现在最喜欢的答案。 - 昨天的amaurymartiny

@amaurymartiny然后接受它... - 昨天的FZs

这里有如此多的知识,+ 1。1 - Code Maniac昨天

@FZs是的。我还在等待其他命题。 - 昨天的amaurymartiny

@CodeManiac:添加了一些解释 - 昨天乔治

+30

像这样的东西

  const a = [2,5,78,4]; const expensiveFunction = n => 2 * n; 让findMap = arr => {let found = arr.find(a => expensiveFunction(a)> 100)返回发现!== undefined?expensiveFunction(found):found} console.log(findMap(a));     

提醒: - 出于好奇,但hacky或者你可以称之为误用 find

2 * n; 让findMap = arr => {let returnValue; let found = arr.find(a => {returnValue = expensiveFunction(a)return returnValue> 100})return returnValue} console.log(findMap(a)); 2 * n; 让findMap = arr => {let returnValue; let found = arr.find(a => {returnValue = expensiveFunction(a)return returnValue> 100})return returnValue} console.log(findMap(a));

不,最终结果应该是昂贵的功能(78),即156. - amaurymartiny昨天

@amaurymartiny再次将发现的值再次传递给昂贵的功能 - 昨天Code Maniac

昂贵的功能是昂贵的,我不想运行它两次。 - 昨天的amaurymartiny

@amaurymartiny据我所知,比你发布的代码最优化,让我想想如果我能拿出别的东西 - Code Maniac昨天

@amaurymartiny刚刚添加了一个hacky版本,你可以称之为滥用find,但仅仅是出于好奇 - 昨天Code Maniac

+20

如果您愿意接受修改数组中的第一个匹配元素,则可以执行以下操作:

  a [a.findIndex((value,index)=> { value = expensiveFunction(value); return(值> 100&&(a [index] = value))})] //返回156   

否则,你需要使用占位符变量来使其工作 - 很可能使for循环成为最干净的选项。

+10

您可以使用 .reduce ,唯一的缺点是一旦找到值就无法停止,但您不必为每个值运行 expensiveFunction 这是一个例子:

  const a = [2,5, 78,4]; const expensiveFunction = n => 2 * n; const result = a.reduce((acc,cur)=> {if(!acc){const r = expensiveFunction(cur); if(r> 100){acc = r;}} return acc;},null ); 的console.log(结果);  

     
			
        
+10

您可以通过使用三元运算符来简化条件并使用filter()来删除数组的布尔(null)值。

  const a = [2,5,78,100]; const result = a.map((n)=> 2 * n> 100?2 * n:null).filter(Boolean)[0]; console.log(result);    

     
			
        
0

为什么不使用更智能的功能进行查找?

  let desiredValue; const result = a.find(x => {desiredValue = expensiveFunction(x); return desiredValue> 100;}); log(desiredValue);   

在找到第一个结果后,它会立即退出昂贵的循环。

是,但结果将是x而不是expensiveFunction(x)的返回值。 - 提图斯昨天

如果您不想再次调用昂贵的功能,请参阅更新 - vantrung -cuncon昨天

在dba.stackexchange.com上搜索它已经多次回答了。 - Sudipta Mondal 8月29日5:11

0

我遵循的方法是尽可能减少调用'expensiveFunction'函数的可能性。为此,我使用了“划分和征服算法”。您将数组分成一半,并在分割元素上调用昂贵的函数来决定继续进行哪一半。递归执行此步骤,直到找到100以上的最小元素。特别是对于非常大的数组,此方法会将昂贵的函数调用减少到显着更小的数字。因此'expensiveFunCaller'功能将在经济上称为'昂贵的功能'。该数组也应该先排序。

  const a = [2,5,78,80] .sort((a,b)=> ab); const expensiveFunction = n => 2 * n; const expensiveFunCaller =([... arr])=> {if(arr.length< 2){let r = expensiveFunction(arr [0]); if(r> 100)返回r; 返回; } else if(arr.length === 2){let r = expensiveFunction(arr [0]); if(r> 100)返回r; r = expensiveFunction(arr [1]); if(r> 100)返回r; 返回; } let idx = Math.floor(arr.length / 2); 令r = expensiveFunction(arr [idx]); return(r< 100)?expensiveFunCaller(arr.slice(idx + 1,arr.length)):expensiveFunCaller(arr.slice(0,idx + 1)); } console.log(expensiveFunCaller(a));   r = expensiveFunction(arr [1]); if(r> 100)返回r; 返回; } let idx = Math.floor(arr.length / 2); 令r = expensiveFunction(arr [idx]); return(r< 100)?expensiveFunCaller(arr.slice(idx + 1,arr.length)):expensiveFunCaller(arr.slice(0,idx + 1)); } console.log(expensiveFunCaller(a));   r = expensiveFunction(arr [1]); if(r> 100)返回r; 返回; } let idx = Math.floor(arr.length / 2); 令r = expensiveFunction(arr [idx]); return(r< 100)?expensiveFunCaller(arr.slice(idx + 1,arr.length)):expensiveFunCaller(arr.slice(0,idx + 1)); } console.log(expensiveFunCaller(a));  
     
			
        

不会对[2,3,78,80]起作用。预计:昂贵的功能(78)。实际:昂贵的功能(80) - 昨天的amaurymartiny

@amaurymartiny我想他想把这个函数应用于数组中最大的数字。他对78有什么特别的兴趣? - 昨天的亚的斯亚贝巴

我想找到数组中的第一个元素,其值由expensiveFunction> 100. - amaurymartiny昨天

@amaurymartiny现在非常清楚,我会尝试编辑它。 - 昨天的亚的斯亚贝巴

14
votes
answers
20 views
+10

检查是否存在对象数组

我有一个对象数组:

  items:[{name:“Cheese Puffs”,price:3},{name:“Can of Soda”,价格:1.75}] ;   

我想做像 items [“cheesePuffs”] === true 这样的事情。但是因为它在数组中它将无法正常工作。

沙发
+30
+50

您可以使用 some hasOwnProperty ,如果您需要实际值而不是布尔值,您可以使用 find 而不是 some

  const myArrOfObjects = [{cheesePuffs:”yes“},{time:”212“}]; 让findByName =(name)=> {return myArrOfObjects.some(obj => {return obj.hasOwnProperty(name)})} console.log(findByName(“cheesePuffs”))console.log(findByName(“time”))console.log(findByName(“

     
			
        
+40

你想要的是 Array.find()

  myArrOfObjects.find(el => el.cheesePuffs);   

假设您正在寻找的属性是真实的,这将返回元素 {cheesePuffs:“yes”} ,这是真实的。如果找不到,则为 undefined

+20

作为建议,您也可以决定不使用数组,而是使用json对象,其中每个项目的索引是对象的唯一名称(在示例“cheesePuffs”中标识“Cheese Puffs”)< / p>

  let items = {“cheesePuffs”:{name:“Cheese Puffs”,price:3},“canOfSoda “:{名称:”Can of Soda“,价格:1.75},}; console.log(“exists:”,items.cheesePuffs!== undefined)console.log(items.cheesePuffs)//也可以这种方式访问??项目:console.log(items [“

     
			
        
+20

尝试以下代码。它将返回名称与'Cheese Puffs'匹配的对象。

  let items = [{name: “奶酪泡芙”,价格:3},{名称:“罐头苏打”,价格:1.75}]; 让itemExist = items.find(x =&gt; x.name ==='Cheese Puffs'); if(itemExist){console.log(itemExist); } else {console.log(“Item not Exist”); }    

     
			
        
+10

首先你有一个对象数组,所以你不能简单地使用

  myArrOfObjects [“cheesePuffs”]   

因为数组需要一个索引所以它应该是 myArrOfObjects [0] [“cheesePuffs”]

  let items = [{name:“Cheese Puffs”,价格:3},{name:“Can of Soda”,价格:1.75}]; let filter = items.find(el =&gt; el.price === 3); console.log(过滤器);    < / div> 

另一种方法

  let items = [{name:“Cheese Puffs”,price: 3},{name:“Can of Soda”,价格:1.75}]; let filter = items.filter(el =&gt; el.price === 3); console.log(过滤器);    

     
			
        
+10

好的简单解决方案

试试这个

  const x = [{}] ; if(x.find(el =&gt; el.cheesePuffs)== undefined)console.log(“数组中的空对象”)const myArrOfObjects = [{cheesePuffs:“yes”},{time:“212”}]; if(myArrOfObjects.find(el =&gt; el.cheesePuffs)== undefined)console.log(“数组中的空对象”)否则console.log(“数组中可用的对象”)  < / div> 

     
			
        

看看这个:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/ - user743414昨天

+10

你可以使用find

  let exist = myArrOfObjects.find(o =&gt; o.cheesePuffs ==='yes') 
     
			
        

阅读行为准则:stackoverflow.com/conduct。使用代码段编写代码。 - 昨天的Dupinder Singh

即使用`并结束它使用` - Samuel Chen昨天

18
votes
answers
22 views
+10

如何将月份值从一个Date对象复制到另一个Date对象?[重复]

这个问题在这里已有答案:

  • Date.getMonth()方法有错误吗? 9个答案

    给定两个Date对象,如何正确设置第一个对象的月份到另一个对象的月份?

    我正面临着一个任务将日期,月份和年份从一个Date对象复制到另一个Date对象。复制日期和年份按预期工作,当我试图复制月份时问题就出现了。 < p>使用 b.setMonth(a.getMonth())会导致b的月份过多。

    使用 b.setMonth(a.getMonth() - 1)但是,导致b的第一个月比需要的少。

    以下打字代码:

     < code> let a = new Date(2018,1,12); 设b = new Date(); 的console.log(a)的 的console.log(b)中; 的console.log( '===='); 的console.log(a.getMonth()); 的console.log(b.getMonth()); b.setMonth(a.getMonth()); 的console.log( '===='); 的console.log(a.getMonth()); 的console.log(b.getMonth()); b.setMonth(a.getMonth() -  1); 的console.log( '===='); 的console.log(a.getMonth()); 的console.log(B。得到月());   

    返回:

      2018年2月12日星期一00:00:00 GMT + 0100 2019年8月29日星期四16:11:03 GMT + 0200 === = 1 7 ==== 1 2 ==== 1 0 // 2  -  1 = 0?  

    看似2 - 1应该给1 (a.getMonth() - 1),但显然Date对象的行为不同。在javascript / typescript中将月份从一个Date对象复制到另一个对象的正确方法是什么?我想将两个日期转换为字符串,复制正确的字符并将字符串解析回Date会起作用,但我想知道是否有更简单,更清晰的方法。 03 GMT + 0200 ==== 1 7 ==== 1 2 ==== 1 0 // 2 - 1 = 0?

    看似2 - 1应该给1 (a.getMonth() - 1),但显然Date对象的行为不同。在javascript / typescript中将月份从一个Date对象复制到另一个对象的正确方法是什么?我想将两个日期转换为字符串,复制正确的字符并将字符串解析回Date会起作用,但我想知道是否有更简单,更清晰的方法。 03 GMT + 0200 ==== 1 7 ==== 1 2 ==== 1 0 // 2 - 1 = 0?

    看似2 - 1应该给1 (a.getMonth() - 1),但显然Date对象的行为不同。在javascript / typescript中将月份从一个Date对象复制到另一个对象的正确方法是什么?我想将两个日期转换为字符串,复制正确的字符并将字符串解析回Date会起作用,但我想知道是否有更简单,更清晰的方法。

沙发
+90
+50

问题是 setMonth()方法有一个可选的第二个参数,即日期( DOCS )。如果您没有提供当天的价值,它将自动使用其中一个日期。

因此,您的A日期是2018年2月12日,而您的B日期是2019年8月29日。

通过 b.setMonth(a.getMonth()); ,你隐含地说 b.setMonth(1,29); (1是a.getMonth( )29是b日期的日期。

所以你试图将日期设定为2月29日,这在2019年是不可能的,它将月份改为1到3月(第2个月) )。

+70

这是因为这是你的幸运(或不幸!)日。这是你工作的特定日期。

今年2月只有28天。当您将“2019年8月29日”的月份设置为2月时,您将尝试创建无效日期“2019年2月29日”。这可以概括为“2019年3月1日”。

如果你昨天尝试过这个实验,你就不会看到这个问题。

+20

这是每月的天数问题。

当你这样做时:

  b.setMonth(a.getMonth());   

你得到的是b日期,但是以2月为月份:2019年2月29日星期四16:11:03 GMT + 0200

2019年2月没有29天。所以日期实际上是3月1日:2019年3月1日星期四16:11:03 GMT + 0200

这就是为什么你在第二组控制台日志中获得第2个月的原因。

最后你设定b.month不是一个月,所以它从一个日期(从二月到一月)减去一个月。

0

因为您使用a.getMonth()而不是b.getMonth()。所以你的主要月份是1而不是2。

0

在设置月份时,您还需要指定可以使用此代码的日期

  var a =新日期(2018年,1日,12日); var b = new Date(); 的console.log(a)的 的console.log(b)中; 的console.log( '===='); 的console.log(a.getMonth()); 的console.log(b.getMonth()); b.setMonth(a.getMonth(),1); 的console.log( '===='); 的console.log(a.getMonth()); 的console.log(b.getMonth()); b.setMonth(a.getMonth() -  1,1); 的console.log( '===='); 的console.log(a.getMonth());

     
			
        
20
votes
answers
22 views
+10

JavaScript用*替换前5个字符

我需要Javascript Regex来替换前5个字符。以下是一些例子。第一行是输入,第二行是预期输出。你能告诉我如何实现这个目标吗?

我试过了。但是如果输入小于4,它们都不起作用。

 。{5}到*****和^ d {5}到*****   

示例

  123456789 XXXXX6789 123 XXX 123456 XXXXX6 1 X 12345 XXXXX  
    
        
沙发
+40

你的第一个正则表达式需要一点调整,这应该有效。

  let reg = /.{1,5}/ let string ='123456789'; let string2 ='123'; console.log(string.replace(reg,(m)=&gt;“X”.repeat(m.length))); console.log(string2.replace(reg,(m)=&gt;“X”.repeat(m.length)));    

     
			
        
板凳
+40

您可以在 .replace()中使用回调函数或lambda:

 < code> var arr = ['123456789','123','123456','1','12345']; arr.forEach(el =&gt; console.log(el,'::',el.replace(/ ^ d {1,5} /,m =&gt; m.replace(/ d / g,'X') )))   

     
			
        
地板
+30

如果你不是在寻找正则表达式解决方案,那么你也可以尝试这个选项。基于substring()方法的替代方法

  function replace_String(string,numberofchar,chartoreplace){return string.substring(0,numberofchar).split(”“)。map(ele =&gt; ele = chartoreplace).join(”“ ).concat(string.substring(numberofchar,string.length))} console.log(replace_String(“123456789”,5,“X”))console.log(replace_String(“1”,1,“*”))   

     
			
        
4楼
+30

你可以做很多方法。一个是两个替换语句

  const hideFive = str =&gt; str.replace(/ ^ d {1,5} /,x =&gt; x.replace(/./ g,'*'))var tests = [“1”,“12”,“123”,“1234 “,”12345“,”123456“,”1234567“,”12345678“,”1234567890“] tests.forEach(val =&gt; console.log(val,'=',hideFive(val)))    

没有胖箭

<

5楼
+30

你可以替换第一个字符并取出字符串的切片。

  const replaceFirst5 = s =&GT; '*'。repeat(Math.min(5,s.length))+ s.slice(5); 的console.log(replaceFirst5( “123456789”)); console.log(replaceFirst5(“123”));    

     
			
        
6楼
+30

您可以使用 replace repeat

  ^。{1,5}   
  • ^ - 字符串开头
  • 。{1,5} - 匹配除新行以外的任何内容,最少一次,最多5次< / li>

      let replaceFirst5 =(str)=&gt; {return str.replace(/ ^。{ 1,5} /,m =&gt;“X”.repeat(m.length))} console.log(replaceFirst5(“123456789”))控制台。log(replaceFirst5(“123”))   
    
         
    			
            

    它使用解构将部分返回值分配给现有标识符主体和客户。 - jonrsharpe 8月28日9:25

    @jonrsharpe可能值得指出,只有客户被破坏.. - Keith 8月28日9:34

7楼
0

假设这些数字包含在名为“数字”的类中

jQuery代码

  $。each('。numbers' ,function(){let num = $(this).text(); var j =“”; for(let i = 0; i&lt; num.length; i ++){if(i == 5){break;} j + =“*”;} var res = str.replace(num.substring(0,5),j); document.getElementById(“demo”)。innerHTML = res;});  
     
			
        
5
votes
answers
22 views
+10

这个javascript语法是什么,你有()围绕整个变量表达式?

 ({body:{customer}} = await callCreateCustomer({email:createRandomEmailAddress(),key:999,password:'password',}));   

当你在整个表达式周围有()时,我不明白这意味着什么?

它做了什么?

沙发
+50

它强制表达式上下文,以便第一个 {不被视为阻止

这有名字吗?如果不是我有一个想法 - >歧义解析器:) - Keith 8月28日9:30

0
votes
answers
90 views
+10

Simultaneos方程求解使用HTML和Javascript

-2

目的項目:Simultaneos方程求解使用HTML和Javascript

爲了解決使用矩陣由兩個線性方程的聯立方程,式:

     X = A^-1 * B 

其中A是由基質的兩個方程的係數,B是由兩個方程的結果組成的矩陣,而X是由兩個變量x和y組成的矩陣。

使用的語言: HTML和JavaScript在單個文件中。

問題:

我該項目的第一個版本是在這裏如下:

https://pastebin.com/mgGReYTL

當我在瀏覽器中打開它(谷歌瀏覽器的最新版本),HTML部分按預期工作,但是,當我單擊「解決」按鈕時,它不會執行任何操作。

所以我試圖用另一種方法:

https://pastebin.com/RbykTH0y

但結果仍然是相同的(HTML工作的罰款,而點擊「解決」按鈕不執行任何操作)。

任何人都可以花一點時間來嘗試爲我提供解決這個問題的方法。

您的努力,您的解決方案,將不勝感激。 :-)

P.S:代碼實際上並不那麼大。

+0

歡迎堆棧溢出!你的問題的全部內容,必須在**你的問題,而不僅僅是鏈接**。鏈接腐爛,使問題及其答案在未來的人們中毫無用處,人們不應該離開現場去幫助你。在**問題中放置[mcve] **,理想情況下使用Stack Snippets('>'工具欄按鈕)使其可以運行([這裏是如何做一個]](https://meta.stackoverflow.com/questions/358992 /香港專業教育學院,被其中透露的to-do-A-運行的,例如與 - 堆棧段,如何-DO-I-DO-THA))。更多:[*我如何提出一個好問題?*](/ help/how-to-ask) –

沙发
0
1

問題是你的函數被稱爲「multiply2d * 1d」。 '*'字符不允許在js的名字裏。有關詳細規則請參見:What characters are valid for JavaScript variable names?

Here a working fiddle (I just changed the function name): 

https://jsfiddle.net/zfkjtax4/

+0

非常感謝,我甚至沒有意識到我的問題太過於愚蠢。 –

0
votes
answers
33 views
+10

如何檢測夜間模式事件 - JavaScript?

0

是否有任何用於改變模式時觸發的夜間模式或javascript事件的CSS前綴?如果用戶啓用夜間模式,我需要元素的自定義顏色。如何檢測夜間模式事件 - JavaScript?

另外如何觸發夜間模式事件像Twitter呢?

感謝

+0

沒有它不是,如果用戶能夠從瀏覽器夜間模式設置 –

沙发
0
0

因爲「夜間模式」,將不僅涉及改變背景顏色,而且字體顏色(加上可能有很多其他的事情)我會推薦一個解決方案,如本:

例如HTML:現在

<body class="night"> 

,在標準模式下body標籤不會有night類默認,但你會通過撥動類福添加此比如jQuery的toggleClass

然後在CSS這樣做...

CSS:

body { 
    color: #000; 
    background-color: #fff; 
} 

body.night { 
    color: #fff; 
    background-color: #000;  
} 

注:僅作爲舉例,請不要在黑色背景上用白色文本:)

現在,當班級切換並添加night類時,所有顏色都會改變,頁面將處於「夜間」模式。

不確定您是否還想要在頁面刷新/導航期間使此模式「粘」的說明;如果是這樣的話,那麼最好在sessioncookie的情況下處理,因爲這會在瀏覽器關閉時過期。

+0

但是,如何檢測用戶改變國防部工作e? –

+0

沒有檢測,只有一個功能。可以初始化'darkmode.css'的**按鈕**或**撥號器**(例如)。我通過創建一個'jQuery'函數來實現,當用戶想要啓用'Dark Mode'時,''link type =「stylesheet」href =「darkmode.css>」'到''標籤。但這**不是非常有效,因爲瀏覽器不保存用戶首選項(不啓用緩存)。 –

+0

@IsmailFarooq你是什麼意思「發現」 - 你的意思是我在最後一句話中談論的是什麼?在用戶切換到網站後,確保在網站導航過程中保持夜間模式不變? – Brett

板凳
0
0

有一個CSS濾鏡,我不知道,Twitter的使用是這樣的(沒有圖像倒置只有文本和背景

注1:你可以降低翻轉過濾器的指數,爲前:0.8 注2:不支持IE :(但支持EDGE它

$('button').on('click', function(){ 
 
    $('.wrap').toggleClass('day night') ; 
 
});
.wrap{ 
 
    background: white; 
 
} 
 
.day{ 
 
    filter: invert(0); 
 
} 
 

 
.night{ 
 
    filter: invert(1); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 

 
<div class="wrap day"> 
 
    <img src="https://placeimg.com/200/150/any" /> 
 

 
    <p>Lorem ipsus </p> 
 
    <button>Day/night</button> 
 
    
 
</div>

+0

其實我的主要問題是如何檢測用戶啓用夜間模式或不是 –

+0

在Twitter上具體您認爲? –

+0

手機瀏覽器上有一個選項,尤其是「啓用夜間模式」我想跟蹤該選項是否有任何事件呢? –

0
votes
answers
44 views
+10

JS:Promise解析器不是函數

1

我試圖運行這個jestJS單元測試,但我確實得到了TypeError: Promise resolver undefined is not a function。我究竟做錯了什麼?JS:Promise解析器不是函數

it('_onSubmit() should throw error if data is missing', (done) => { 
    const createUserMutation =() => new Promise() 
    const wrapper = shallow(<CreateAccount createUserMutation={createUserMutation} />) 
    wrapper.update().find(Form).simulate('submit', { 
    preventDefault:() => {} 
    }) 
    createUserMutation.resolve().then(() => { 
    expect(console.error).toHaveBeenCalled() 
    done() 
    }) 
}) 
+2

Promise構造函數需要一個函數。並且promise實例沒有'resolve'方法。 –

+1

我正在試圖弄清楚這個測試應該如何工作,非常困難。您能否引導我們瞭解導致此代碼的思維過程以及您嘗試使用諾言的原因? – JLRishe

+0

爲什麼你在這裏使用promise?哪部分代碼是異步的? – Bergi

沙发
0
2

new Promise()正試圖創建一個沒有執行程序函數*的承諾。正確的用法是在接受最多兩個參數(resolvereject),例如一個函數來傳遞:

var p = new Promise((resolve, reject) => { 
    // ...code that does something, ultimately calls either resolve or reject 
}); 

更多關於MDN:

之後,您似乎試圖在promise實例上調用resolve。你不能這樣做(除非你不使用標準承諾)。您使用傳入執行器的函數來解析承諾。 (我試圖修改代碼給你,但需要太多的背景信息。)


*我很驚訝地看到V8的錯誤消息說「解析器功能」,但我已經驗證它。 The spec稱它是一個執行者,我會認爲一個「解析器函數」將構造函數作爲第一個參數傳遞給它的函數...

+0

但我不明白如何讓'resolve()。then()'進入Promise ... – user3142695

+0

@ user3142695:恐怕我無法關注你的代碼。通常,所有的行爲都發生在承諾執行者的內部,但是在你的情況下,它包裹在一個箭頭函數中;不知道更多關於您的項目的信息恐怕我無法真正解釋如何更新該代碼。儘管如此,請參閱鏈接文章(我已經添加了第二篇文章),以獲取有關如何使用承諾的更多信息。 –

板凳
0
1

如果你只想創建一個解決的承諾,那麼使用Promise.resolve(),它返回一個新的,已經解決的承諾。

new Promise()是用於將非承諾(通常是異步)代碼轉換爲承諾,但它看起來並不像你需要的那樣。如果你打算使用它,你必須傳遞一個函數(就像Felix Kling和TJ Crowder已經注意到的那樣)。

一些積分:

  • 您正在定義createUserMutation的功能,當你使用它這麼幾行字後,你就需要把它用()通話。或者你可以選擇讓它不是一個功能,因爲看起來你在這裏試圖做的是產生一個承諾。
  • 另外,正如Felix Kling指出的,承諾沒有resolve()方法。你可以致電.then()Promise.resolve()產生的承諾。
+0

FWIW,重新設置你的第一個要點,我懷疑它是正確的:她/他傳遞函數而不是它的結果,作爲的道具(可能在變異用戶時可以調用它)。 (但顯然我們需要更多的上下文來確保任何方式。) –

0
votes
answers
43 views
+10

過濾JSON陣列使所有MAX值在JavaScript

-3

這是原始數組,過濾JSON陣列使所有MAX值在JavaScript

var dates = 
[ { user_id: '1', week_number: '2', amount: '100' }, 
    { user_id: '1', week_number: '2', amount: '100' }, 
    { user_id: '1', week_number: '2', amount: '100' }, 
    { user_id: '1', week_number: '3', amount: '100' }, 
    { user_id: '3', week_number: '3', amount: '100' } ] 

更新

首先,我試圖排序最高week_number值陣列:

var x = dates.sort(function (itemA, itemB) { 
    return itemA.week_number < itemB.week_number; 
    }); 

得到:

[ { user_id: '1', week_number: '3', amount: '100' }, 
    { user_id: '3', week_number: '3', amount: '100' }, 
    { user_id: '1', week_number: '2', amount: '100' }, 
    { user_id: '1', week_number: '2', amount: '100' }, 
    { user_id: '1', week_number: '2', amount: '100' } ] 

,然後use.filter得到

[ { user_id: '1', week_number: '3', amount: '100' }, 
    { user_id: '3', week_number: '3', amount: '100' },] 

後來我發現reduce方法,但它只返回最高week_number值的對象。

var max = dates.reduce(function(prev, current) { 
    return (prev.week_number > current.week_number) ? prev : current 
    }) 

正如你所見,.filter將完成工作。

非常感謝您提供的所有答案。你是最棒的!!!

+0

比它應該表現出數組對象包含' '4'' –

+0

我的意思是,如果只有一個項目'WEEK_NUMBER:' 4''和多個'WEEK_NUMBER:「3 ''? – RomanPerekhrest

+0

如果你可以保證列表是'week_number'排序,那麼你所需要做的就是在最後開始一個循環,並在'week_number'中斷時包含'week_number:'max'' –

沙发
0
1

使用map方法來獲取所有的week_number。獲得此數組中最大的,現在在filter方法使用該最大值得到匹配對象

var dates = [{ 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '4', 
 
    week_number: '4', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '3', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '3', 
 
    week_number: '3', 
 
    amount: '100' 
 
    } 
 
] 
 

 
var o = dates.map(function(item) { 
 
    return +item.week_number; 
 
}).sort(function(a, b) { 
 
    return a - b 
 
})[dates.length - 1] 
 
console.log(o) 
 
var m = dates.filter(function(elem) { 
 
    return elem.week_number === o.toString(); 
 
}) 
 
console.log(m)

EDIT

在上面的代碼中的地圖功能冗餘的,排序的日期將給予最大WEEK_NUMBER的對象,那麼濾波器可用於獲得所需的結果

var dates = [{ 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '4', 
 
    week_number: '4', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '3', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '3', 
 
    week_number: '3', 
 
    amount: '100' 
 
    } 
 
] 
 

 
var o = dates.sort(function(a, b) { 
 
    return a.week_number - b.week_number 
 
})[dates.length - 1] 
 

 
var m = dates.filter(function(elem) { 
 
    return elem.week_number === o.week_number; 
 
}) 
 
console.log(m)

+0

是的!非常感謝:] –

+0

如果在數組中間有'{user_id:'4',week_number:'4',amount:'100'}',那麼這將不起作用 – RomanPerekhrest

+0

爲什麼'.map()'? OP的原始'.reduce()'會更好(有些修復)。如果你可以假定最大的'week_number'在最後,'.map()'是完全多餘的,因爲你可以做'var o = dates [dates.length-1] .week_number' – 2017-11-11 16:49:49

板凳
0
1

您可以通過檢查week_number來使用單循環方法,並在必要時替換結果集。

var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }], 
 
    result = dates.reduce(function (r, o, i) { 
 
     return !i || r[0].week_number < o.week_number 
 
      ? [o] 
 
      : r[0].week_number === o.week_number 
 
       ? r.concat(o) 
 
       : r; 
 
    }, []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

如果會有'{user_id:'4',week_number:'4',amount:'100'}'作爲最後一項 – RomanPerekhrest

+0

@RomanPerekhrest,那麼這是行不通的,對,我認爲id應該得到尊重。無論如何, –

+0

似乎OP不考慮任何其他方法 – RomanPerekhrest

地板
0
0

reduce可能不是此任務的最佳工具。相反,循環式的解決方案可能是更好:

var maxWeek = 0; 
var max = []; 
dates.forEach(function(date) { 
    const week = date.week_number; 
    if (week > maxWeek) { 
     maxWeek = week; 
     max = [date]; 
    } 
    else if (week === maxWeek) { 
     max.push(date); 
    } 
}); 

注:我沒有測試此代碼,所以我不能保證沒有錯誤的。

4楼
0
0

隨着Array.sort()功能:

的第一個示例用額外的項目擴展:

var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }, { user_id: '4', week_number: '4', amount: '100' }], 
 
    result = []; 
 

 
dates.sort(function(a, b){ return +b.week_number - +a.week_number; }); 
 
result.push(dates[0]); 
 
for (var i=2, len = dates.length; i<=len; i++) { 
 
    if (dates[i].week_number != result[0].week_number) break; 
 
    result.push(dates[i]); 
 
} 
 
console.log(result);

5楼
0
0
var res = [], prev, max; 
for (var i = 0, len = dates.length; i < len; i++) { 
    max = parseInt(dates[i].week_number); 
    if (!res.length) { 
    prev = max; res.push(dates[i]); 
    } else if (prev === max) { 
    res.push(dates[i]); 
    } else if (max > prev) { 
    prev = max; res.length = 0; res.push(dates[i]); 
    } 
} 
6楼
0
0

鑑於名單上week_number排序,它只是一個簡單的反向循環。

var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }]; 
 

 
var i = dates.length; 
 
var last = dates[--i]; 
 
while (--i !== -1 && dates[i].week_number === last.week_number) { 
 
} 
 

 
var res = dates.slice(i+1); 
 
console.log(res);


或者使用??,雖然你沒有得到制止環。

var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }]; 
 

 
var res = dates.reduceRight((a, obj) => 
 
    a.length && obj.week_number !== a[a.length-1].week_number ? a : [obj, ...a] 
 
, []); 
 

 
console.log(res);


但是,如果你不能依賴列表的排序順序,那麼你應該使用.reduce()你已經寫了,並在.filter()使用它的結果操作。

var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }]; 
 
    
 
var max = dates.reduce((p, c) => +p.week_number > +c.week_number ? p : c).week_number; 
 
var res = dates.filter(d => d.week_number == max) 
 

 
console.log(res);

0
votes
answers
41 views
+10

加載新的html內容後工具提示不起作用

0

我在加載新元素在div中後顯示工具提示有問題。加載新的html內容後工具提示不起作用

我的內容加載代碼:

$ (Function() { 
     
     $ ('. Prop-next'). Click (function() { 
         $ ('.props') .html ('<img src = "/ images/loading.gif" class = "loading" />') 
         var p = parseInt ($ (this) .attr ('p')) + 3; 
         $ (this) .attr ('p', p); 
         $ .post ('/ lib/props.php', {p: p}, function (item) { 
             $ ('. Props'). Html (item); 
         }); 
     }); 
}); 
調用div中.prop,接下來點擊元素時

.props新的內容出現,而腳本不起作用:

提示代碼:

var tooltips = document.querySelectorAll ('.tooltip'); 

window.onmousemove = function (e) { 
     var x = (e.clientX - 350) + 'px', 
         y = (e.clientY + 50) + 'px'; 
     for (var i = 0; i <tooltips.length; i ++) { 
         tooltips [i] .style.top = y; 
         tooltips [i] .style.left = x; 
     } 
}; 
+0

在您的查詢選擇器和網址中存在多個空格('')字符使這個腳本無法工作 – 3Dos

+0

空格w ^在代碼在編輯器中輸入時創建。我向你保證代碼中沒有空格 – urbmake

沙发
0
0

您的綁定鼠標移動的代碼僅在頁面加載時完成一次,並且因此導致新項目(通過AJAX下線的項目)不是h AVING是暴食補充,而不是..:

window.onmousemove = function (e) { // .. } 

嘗試這麼加dinamicly,或現場掛鉤,,這樣的事情應該工作:

$('body').on('mousemove', '.tooltip', function(e) { 
    var x = (e.clientX - 350) + 'px', 
    y = (e.clientY + 50) + 'px'; 
    for (var i = 0; i < tooltips.length; i++) { 
    tooltips[i].style.top = y; 
    tooltips[i].style.left = x; 
    } 
}); 

在這一行:$('body').on('mousemove', '.tooltip', ..你定義你的父元素(body)跟蹤鼠標移動僅在.tooltip元素上,並且會跟蹤您在頁面上顯示的新元素:)

+0

你提供的代碼不起作用。粘貼代碼:var tooltips = document.querySelectorAll('。tooltip'); (e.clientX-350)+'px'; var y =(e.clientY +('body')。('mousemove','.tooltip',function 50)+'px'; for(var i = 0; i urbmake

+0

嘗試「提醒」某些內容,以查看我的代碼是否獲得了新項目的可執行文件 –

+0

我從瀏覽器中刪除了緩存,並且代碼正常工作。謝謝:) – urbmake