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: 48

0
votes
answers
7 views
+10

偶數應返回大寫

0

在字符串上創建一個函數,該函數需要一個整數n作爲參數。
如果n甚至數字,它應返回大寫字符串中的字符串。
如果n奇數,它應返回字符串小寫字母偶數應返回大寫

基本上,我需要編寫一個腳本,使以下可能。

'stringname'.functionName(5)應該返回'stringname' 'stringname'.functionName(4)應該返回'STRINGNAME'

var i=2; 
module.exports = function(i) { 
    return String(stringname)["to"+(i%2?"Low":"Upp")+"erCase"]();  
} 

但不幸的是,我沒能達到我期望的輸出。

+0

這是如何的NodeJS? –

沙发
0
3

function upperIfEven(input, n) { 
 
    return (n % 2 == 0) ? input.toUpperCase() : input.toLowerCase(); 
 
} 
 

 
console.log(upperIfEven('Hello World', 10)); 
 
console.log(upperIfEven('Hello World', 3));

+0

請問您可以寫出完整的程序..我是新的節點js –

+0

現在添加演示... 30秒 –

+1

我給了一個通用的JavaScript答案。你能否將我的答案融入自己的需求? –

板凳
0
4

String.prototype.upperIfEven = function(n){ 
 
    return (n % 2 == 0) ? this.toUpperCase() : this.toLowerCase(); 
 
} 
 

 
var odd = "Hello".upperIfEven(5) 
 

 
var even = "Hello".upperIfEven(6) 
 

 
console.log("Odd -> ",odd) 
 

 
console.log("Even -> ",even)

+0

它顯示了一些錯誤 –

+0

更新了答案 – ricky

+0

它不顯示出來..它只顯示在屏幕上的白色屏幕輸出 –

地板
0
0

你可以使用與根據偶/奇值改變的情況下的方法名稱的數組。

function upperIfEven(input, n) { 
 
    return input[['toUpperCase', 'toLowerCase'][n % 2]](); 
 
} 
 

 
console.log(upperIfEven('Hello World', 10)); 
 
console.log(upperIfEven('Hello World', 3));

0
votes
answers
20 views
+10

使用bash

1

的package.json文件的讀取name屬性我有這樣的:使用bash

str=`cat package.json` 
prop="name" 
my_val="$(node -e "console.log(JSON.parse(${str})[${prop}]);")" 
echo "$my_val" 

我想讀的package.json文件的name財產。我認爲這是接近,但我得到一個JSON.parse錯誤:

SyntaxError: Unexpected token o in JSON at position 1 
    at Object.parse (native) 
    at [eval]:1:18 
    at ContextifyScript.Script.runInThisContext (vm.js:25:33) 
    at Object.runInThisContext (vm.js:97:38) 

任何人都知道如何解決?

這工作:

prop="name" 
my_val="$(node -e "console.log(require('./package.json')['$prop'])")" 
echo "json val: '$my_val'" 

但我想知道如何做到這一點的第一種方式。

node -e "console.log(JSON.parse(`$str`)['name'])" 

注意反引號:

沙发
0
1

,因爲你正在試圖解析字符串

"[object Object]" 

你應該改變你的bash腳本有你得到一個JSON解析錯誤!你的字符串是一個多行字符串。

這裏有一個運行(在我的項目目錄之一):

$ str=`cat package.json` 
$ prop="name" 
$ myval="$(node -e "console.log(JSON.parse(`$str`)['$prop'])")" 
$ echo $myval 
plainscript 

附錄

爲響應OP希望使用require而不是文件的內容呼應成字符串,該解決方案可以如下:

$ prop="name" 
$ my_val="$(node -e "console.log(require('./package.json')['$prop'])")" 
$ echo $my_val 
plainscript 

附錄2

你甚至可以離開關console.log如果你使用-p

$ prop="name" 
$ my_val="$(node -pe "require('./package.json')['$prop']")" 
$ echo $my_val 
plainscript 
+0

感謝讓我試試吧,長相值得的。我更新了這個問題 - 您知道爲防止'undefined'始終從'node -e'記錄的任何方式嗎?標準輸出包括'未定義'在最後,我認爲有一種方法可以防止這種情況,但我忘記了。 –

+0

是的,刪除'-p' –

+0

好酷,我忘記了'-p' arg是什麼,你也可以使用'||'顯然是這樣的:'my_val =「$(node -pe」console.log (require('./ package.json')['$ prop'])||''「)」' –

板凳
0
4

在Linux系統中有命令JQ可以解析JSON文件

jq -r ".name" package.json 
+0

非常酷!如果你在Mac上:'brew install jq'可以得到你的程序。 –

+0

'brew install jq'可以在MacOS *上獲得該程序*,而不是* nix ...'jq'是否包含Bash v4? –

+1

@AlexanderMills它完全獨立於'bash'(就像'grep','awk','sed','node'等等),但是如果你想從命令行使用JSON, *建議您安裝它。您的發行版可能會將其包含在其存儲庫中,但手動安裝非常簡單;它是一個靜態鏈接的二進制文件。請參閱https://stedolan.github.io/jq/download/ – chepner

0
votes
answers
28 views
+10

在所有服務啓動後啓動node.js應用程序

0

例如我有兩個服務:db和隊列 我需要在db和amqp連接到它們的服務器之後啓動服務器。在所有服務啓動後啓動node.js應用程序

現在我有這樣的事情server.js

let mongo = require('./server/db'); 
let qManager = require('./server/amqp'); 

mongo.connect(()=>{ 
    qManager.connect(()=>{ 
     http.listen(3001, function() { 
      console.log('listening on *:3001'); 
     }); 
    }); 
}); 

蒙戈連接方法:

const connectDb = (callback) => { 
    if (state.db) return state.db; 
    let connection = MongoClient.connect(mongoUrl, (err, db) => { 
     if (err) { 
      connectDb(); 
     } 
     state.db = db; 
     console.log('Mongo connected.'); 
     callback(); 
    }); 
}; 

RabbitMQ的連接方法:

const connect = (callback) => { 
    connection = amqp.connect(url) 
     .then(conn => { 
      module.connection = conn; 
      channel = conn.createChannel(); 
      console.log('Queue connected.'); 
      pythonResultListener(); 

      callback() 
     }) 
     .catch(err => { 
      console.error('Connect failed: %s', err); 
     }); 
    return connection; 
}; 

也許有多大更好的方法?謝謝。

沙发
0
0

處理異步流程有幾種方法。 對於你的具體情況:

非常快EXA mple與async/await

// First you modify your callback function to be promises 
// For example mongoconnect method implementation: 
const connectDb = function() { 
    return new Promise (resolve, reject) => { 
    if (state.db) return state.db; 
    let connection = MongoClient.connect(mongoUrl, (err, db) => { 
     if (err) return reject(err); 
     state.db = db; 
     console.log('Mongo connected.'); 
     resolve(); 
    }); 
    }); 
}; 

而現在,假設你有承諾A,B,C,你的目標是通過一個叫他們一個:

const promises = [ A, B, C ]; 
for (const promiseFunc of promises) { 
    const res = await promiseFunc(); 
    // For cases you need to return something 
    console.log(res); 
} 

更多信息,你可以找到here

板凳
0
0

你做得很好。在啓動服務器之前放置所有init邏輯。直到完成所有初始化後才啓動服務器。

你可以模塊化將獨立的初始化放置在它們各自的模塊中的一件事。這樣你可以很好地管理它們。

0
votes
answers
23 views
+10

RTMP測試NODEJS

-1

我們可以測試一個RTMP鏈接並找出它是否有效嗎?像使用NODEJS的HTTP請求(並且有一個標頭)?RTMP測試NODEJS

+0

添加一些實施或者試圖聯繫! –

沙发
0
0

例如,我想有一個答案: RTMP://cp108478.live.edgefcs.net/live/arte_en_1_800

如果該鏈接存在與否

0
votes
answers
11 views
+10

爲什麼我不能在我的節點應用程序中重命名這個對象?

0

我有一個node.js/express應用程序使用node-postgres模塊與Postgres數據庫進行通信。它正在處理異步/等待,但是如果我將對象重命名爲{rows}以外的任何其他對象,則會返回undefined。這是我的代碼;注意右下async和註釋,上面const { rows } = ...爲什麼我不能在我的節點應用程序中重命名這個對象?

var express = require('express'); 
var router = express.Router(); 

const { Pool } = require('pg'); 
const pool = new Pool({ 
    connectionString: 'postgresql://[email protected]/mydb' 
}); 

router.post('/login', function(req, res, next) { 
    var username = req.body.username; 
    var password = req.body.password; 

    (async() => { 
    // if I rename this from "rows" to, say, "userdetails", it comes back undefined 
    const { rows } = await pool.query(` 
      SELECT id, password 
      FROM myschema.users 
      WHERE username = $1 
      LIMIT 1;`,[username]); 

    if (rows.length) { 
     // check password, etc, etc. 
     return res.status(200).send(); 
    } else { 
     return res.status(401).send(); 
    }  
    })().catch(e => setImmediate(() => { 
    res.status(500); 
    } 
)); 

}); 

module.exports = router; 

我敢肯定,我想的東西很基本在這裏,但我爲什麼不能重命名此? pg模塊是否指定返回的var/const必須命名爲{ rows }?如果是這樣,我怎麼會發現?我在await處設置了一個斷點並逐步完成代碼,但對我而言仍然不清楚。

+0

以防萬一,你重命名的所有實例行變量到你的新變量名? – Alan

沙发
0
1

當您執行const { rows } = xxx時,您正在使用object destructing將??3210屬性分配給本地作用域中與該屬性具有相同名稱的新變量。

因此,當您更改屬性的名稱到別的東西:

const { myVar } = xxx; 

代碼正在尋找合適的物業xxx.myVar這可能不存在,因此最終undefined

如果要使用不同的名稱,則必須使用不同形式的對象解構賦值(包括新名稱),或者根本不使用解構並僅將.rows屬性分配給新的變量。

例如,你可以這樣做,而不是:

const result = await pool.query(` 
      SELECT id, password 
      FROM myschema.users 
      WHERE username = $1 
      LIMIT 1;`,[username]); 

const myVar = result.rows; 

或者你可以在對象解構賦值指定一個新的名字:

const {rows: myVar} = await pool.query(` 
      SELECT id, password 
      FROM myschema.users 
      WHERE username = $1 
      LIMIT 1;`,[username]); 

console.log(myVar); 
+0

謝謝。列出替代方案非常有幫助。 – rotarydial

板凳
0
1

這叫做。當你做這樣的事情

const { row } = someObject 

那麼變量row等於row property of someObject。但如果someObject甚至沒有任何row財產,那麼row明顯將爲undefined

你的情況也是如此。 await pool.query(...返回的對象有rows屬性,這就是爲什麼const { rows }有效,但它沒有userdetails屬性,因此undefined

0
votes
answers
22 views
+10

在electron.js中打開文件

0

我想製作electronjs文本編輯器應用程序,我希望能夠使用編輯器內編寫的腳本打開新窗口。例如,我在我的編輯器中有小腳本,當我在瀏覽器中按下打開時,它會打開並加載到瀏覽器窗口中。這是我的代碼的一部分。在electron.js中打開文件

function createWindow() { 
    // Create the browser window. 
    mainWindow = new BrowserWindow({ 
    width: 800, 
    height: 600, 
    }); 

    // and load the index.html of the app. 
    mainWindow.loadURL(
    url.format({ 
     pathname: path.join(__dirname, 'index.html'), 
     protocol: 'file:', 
     slashes: true, 
    }) 
); 

    // Open the DevTools. 
    mainWindow.webContents.openDevTools(); 

    // Emitted when the window is closed. 
    mainWindow.on('closed', function() { 
    // Dereference the window object, usually you would store windows 
    // in an array if your app supports multi windows, this is the time 
    // when you should delete the corresponding element. 
    mainWindow = null; 
    }); 

    // trigger autoupdate check 
    autoUpdater.checkForUpdates(); 
} 

我在HTML按鈕:

<button id="openBrowser"><img src="img/16x16/diskette.png"/>Open in Browser </button> 
沙发
0
0

如果你想在外部窗口中打開它,你就需要導入外殼

const shell = require('electron').shell

然後你需要使用shell的openExternal方法

shell.openExternal('yourpathhere')

那是你在追求什麼?

https://github.com/electron/electron/blob/master/docs/api/browser-window.md

+0

哎呀,我犯了一個錯誤,所以我編輯它。我寫了'BrowserWindow',我的意思是'openExternal'。對不起,有任何困惑 –

0
votes
answers
32 views
+10

如何檢索來自模塊的數據,並將結果存儲在變量中的NodeJS

0

我有此代碼如何檢索來自模塊的數據,並將結果存儲在變量中的NodeJS

 TinyURL.shorten(idvar , function(res) { 
      console.log(res);  //Returns a shorter version of http://google.com 
     }) 

縮短URL。我想要res的返回值並將其存儲在一個變量中,以便我可以在其他地方使用結果。 我已經使用了

return res; 

但它沒有幫助我。 它與諾言有關嗎? 如果是,請也請解釋一下。

+0

不'TinyURL.shorten'返回一個承諾?還是需要回調? – James

+0

@james它返回的是較短的url版本,諾言沒有提到 – Addictd

+0

不是我的意思,如果你做'console.log(TinyURL.shorten(idvar))'(不提供回調),你會看到什麼 – James

沙发
0
0

您可以「promisify」您的TinyURL.shortern函數,例如

const shortenUrl = url => new Promise((resolve, reject) => 
    TinyURL.shorten(url, (err, res) => err ? reject(err) : resolve(res)) 
); 

然後你就可以利用async/await

async someApi() { 
    try { 
    const shortened = await shortenUrl('http://google.com'); 
    console.log(shortened); 
    } catch (e) { 
    console.error(e); 
    } 
} 
0
votes
answers
9 views
+10

如何將參數傳遞給express.js中的嵌套控制器?

0

我有一個這樣的路由器:如何將參數傳遞給express.js中的嵌套控制器?

app.get('/rest/userList', (req, res) => { 

    UserList.find({}, (err, users) => { 
     if (err) res.send(err); 
     res.json(users); 
    }); 
}); 

我想改變這樣的:

app.get('/rest/userList', getUsers); 

function getUsers(req, res) { 
    UserList.find({}, createResponse); 
} 

function createResponse(err, users) { 
    if (err) return res.send(err); 
    return res.send(users); 
} 

然而,在createResponse函數中'res'是未定義的。我怎樣才能做到這一點?

沙发
0
2

您可以使用.bind()額外的參數綁定到回調:

app.get('/rest/userList', getUsers); 

function getUsers(req, res) { 
    UserList.find({}, createResponse.bind(null, res)); 
} 

function createResponse(res, err, users) { 
    if (err) return res.send(err); 
    return res.send(users); 
} 
+0

這其實就是我試圖達到目的的幹!日Thnx! – Mar

板凳
0
1
app.get('/rest/userList', getUsers, createResponse); 

function getUsers(req, res, next) { 
    UserList.find({}, function (err, users) { 
     if (err) { 
      req.errr = err; 
     } else { 
      req.users = users; 
     } 

     next(); 
    }); 
} 

function createResponse(req, res) { 
    if (req.err) return res.send(req.err); 
    return res.send(req.users); 
} 
0
votes
answers
23 views
+10

虛假AJAX OPTIONS請求被用GET請求

0

我想提出以下虛假AJAX OPTIONS請求被用GET請求

let x = new XMLHttpRequest(); 
x.onload = function(event) { …}; 
x.open("GET", url, true); 
x.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); 
x.send(); 

問題與代碼標準的AJAX請求是,由於某種原因,我無法捉摸,二Ajax請求是一起做製作。第一個是OPTIONS請求,第二個是我真正想要的GET請求。任何想法爲什麼?

我的服務器是一個應用程序的NodeJS其中我使用nodemon其重新啓動服務器,如果它檢測index.js已發生變化(這是發展有幫助的,當你不希望停止和重新啓動服務器)。通過此OPTIONS業務,nodemon認爲我的index.js已更改並重新啓動nodejs

此外,OPTIONS請求會返回一個成功的請求,返回http 200.但是,沒有任何內容返回到首先發起ajax請求的網頁(這可能是OPTIONS請求後立即發生的,nodejs通過nodemon重新啓動。然後GET請求是重複的,也有200和網頁得到結果

沙发
0
1

的問題是,由於某種原因,我無法捉摸,二Ajax請求製成。第一一個是OPTIONS請求,第二個是我真正想要的GET請求。任何想法爲什麼?

由於您正在進行跨通信來電(例如,從http://localhosthttp://localhost:someport),Same Origin Policy通常不允許這樣做。所以瀏覽器發送一個「pre-flight」OPTIONS請求來查看服務器是否想通過Cross-Origin Resource Sharing來允許呼叫。

12
votes
answers
14 views
+10

JSON.stringify, avoid TypeError: Converting circular structure to JSON

I have a big object I want to convert to JSON and send. However it has circular structure. I want to toss whatever circular references exist and send whatever can be stringified. How do I do that?

Thanks.

var obj = {
  a: "foo",
  b: obj
}

I want to stringify obj into:

{"a":"foo"}
沙发
+40
  var a = {b:“b”}; AA = A; JSON.stringify(preventCircularJson的(a));   

評估為:

 “{”b“:”b“,”a“:”CIRCULAR_REFERENCE_REMOVED“}”  

使用函數:

  / ** *遍歷一個javascript對象,並刪除所有循環值* @param源對像以從* @param刪除循環引用censoredMessage可選:什麼到而不是審查值* @param censorTheseItems應保持為null,用於遞歸* @returns {undefined} * / function preventCircularJson(source,censoredMessage,censorTheseItems){// init遞歸值,如果這是第一次調用censorTheseItems = censorTheseItems | | [資源]; //默認如果沒有指定censoredMessage = censoredMessage || “CIRCULAR_REFERENCE_REMOVED”; //全部已經apeared的值將放在這裡:var recursiveItems = {}; //初始化一個被刪除的克隆返回var ret = {}; //遍歷對象:for(var中的源鍵){var value = source [key] if(typeof value ==“object”){//稍後再次檢查所有復雜的子項:recursiveItems [key] = value; } else {//將復制的簡單值複製為ret [key] = value; }} //為censor創建值列表:var censorChildItems = []; for(varcursiveItems中的var鍵){var value = source [key]; //所有復雜的子對像都不應該在子節點中再次出現:censorChildItems。推(值); } //檢查(recursiveItems中的var key)的所有循環值{var value = source [key]; var censored = false; censorTheseItems.forEach(function(item){if(item === value){censored = true;}}); if(censored){//將循環值更改為此值= censoredMessage; } else {// recursion:value = preventCircularJson(value,censoredMessage,censorChildItems.concat(censorTheseItems)); } ret [key] = value} return ret; }   forEach(function(item){if(item === value){censored = true;}}); if(censored){//將循環值更改為此值= censoredMessage; } else {// recursion:value = preventCircularJson(value,censoredMessage,censorChildItems.concat(censorTheseItems)); } ret [key] = value} return ret; }   forEach(function(item){if(item === value){censored = true;}}); if(censored){//將循環值更改為此值= censoredMessage; } else {// recursion:value = preventCircularJson(value,censoredMessage,censorChildItems.concat(censorTheseItems)); } ret [key] = value} return ret; }  
     
			
        
板凳
+30

我知道這是一個老問題,但我想建議我創建一個名為智能循環,其工作方式與提出的其他方式不同。如果您使用大而深的對象,它會特別有用。

一些功能是:

  • 通過導致第一次出現的路徑(而不僅僅是字符串)替換對象內的循環引用或簡單重複的結構[圓形] );

  • 通過在廣度優先搜索中查找圓形,包確保此路徑盡可能小,這在處理時很重要有很大很深的物體,

地板
+20

JSON.stringify()的第二個參數允許您指定應從其在數據中遇到的每個對象保留的鍵名數組。這可能不適用於所有用例,但這是一個更簡單的解決方案。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

  var obj = {a:“foo”,b:this} var json = JSON.stringify(obj,['a']); 的console.log(JSON); // {“a”:“foo”}   

注意: 奇怪的是,OP中的對象定義不會在最新的Chrome或Firefox中引發循環引用錯誤。修改了此答案中的定義,以便 拋出錯誤。


4楼
+10

如果

  console.log(JSON.stringify(object));   

導致

TypeError:循環對象值

然後你可能想要這樣打印:< / p>

  var output =''; for(對像中的屬性){output + = property +':'+ object [property] +'; '; } console.log(輸出);  
     
			
        

投票確實真的??? 請解釋 !! - Thorsten Niehues 2013年10月26日11:51

也許是因為它只打印一個級別? - Alex Turpin 2013年12月19日23:52

非常簡單,我贊成這一點,因為它在Chrome中開箱即用。優秀 - 愛與和平 - Joe Codeswell 18年8月28日19:40

5楼
+10

我在github上找到了 circular-json庫,這對我的問題很有幫助。

我發現一些有用的好功能:

  • 支持多平台使用,但到目前為止我只用node.js測試過它。
  • API是一樣的所有你需要做的就是包含並使用它作為JSON的替代品。
  • 它有自己的解析方法,所以你可以將'循環'序列化數據轉換回對象。

這個庫給我一個錯誤,所以我得尋找另一個。錯誤TypeError:toISOString不是Object的String.toJSON()的函數。(localhost:8100 / build / polyfills.js:1:3458),位於Object的JSON.stringify()。 stringifyRecursion [as stringify](localhost:8100 / build / main.js:258450:15) - Mark Ellul 18年8月18日9:51

@MarkEllul我在2015年寫過評論,如果我看到更好的選擇,我會在這裡發布一個編輯。我偶爾也會在日常工作中遇到同樣的問題,我通常會以遞歸的方式通過適當/安全的檢查來選擇自己的手動功能。如果您不熟悉,我建議您查看函數式編程實踐,通常情況下,它會減少這種遞歸操作,因為它不那麼棘手,更可靠。 - JacopKane 6月2日凌晨1點36分

6楼
+10

我這樣解決了這個問題:

  var util = require('util'); //我們的循環對象var obj = {foo:{bar:null},a:{a:{a:{a:{a:{a:{a:{hi:'Yo!'}}}}}} }}; obj.foo.bar = obj; //生成幾乎有效的JS對象定義代碼(typeof string)var str = util.inspect(b,{depth:null}); //將代碼修復為有效狀態(在此示例中,它不是必需的,但我的對象龐大而復雜,我需要這個用於我的情況)str = str .replace(/&lt; Buffer [w。] +&gt; / ig,'“buffer”')。replace(/ [Function] / ig,'function(){}')。replace(/ [Circular] / ig,'“Circular”').replace(/ {[Function :([w] +)] / ig,'{$ 1:function $ 1(){},').replace(/ [Function:([w] +)] / ig,'function $ 1(){}') .replace(/(w +):( [w:] + GMT + [w()] +),/ ig,'$ 1:新日期(“$ 2”),')。replace(/(S +):,/ ig,'$ 1:null,'); //創建函數以eval stringifyed代碼var foo = new Function('return'+ str +';'); //並享受有趣的console.log(JSON.stringify(foo(),null,4));  
     
			
        

這對我來說非常有用,但看起來類似於_class:ClassName {data:“here”},所以我添加了以下規則.replace(/(w +){/ g,'{__ ClassName__:“$ 1” ,')。在我的情況下,我試圖看看http請求對像是什麼樣的。 - redbmk 2016年5月7日18:29

7楼
0

使用此庫解決此問題的另一個解決方案是使用此庫

https://github.com/ericmuyser/stringy

它很簡單,你可以通過幾個簡單的步驟來解決這個問題。

根據文檔,你是對的, - dev安裝devdeps,否則,只安裝deps。npmjs.org/doc/json.html。我知道這適用於命名包,至少。 - mna 2012年2月13日22:54

如果你在2015年遇到這個問題,那麼--save-dev開關就可以完全按照本課題的要求進行操作。 - Sutikshan Dubey 2015年3月25日8:38

這個答案stackoverflow.com/a/22004559/3718119給出了依賴關係和devDependencies之間的差異以及何時使用它們的一個很好的解釋。 - quasoft 2015年9月11日12:02

8楼
0

根據其他答案,我最終得到以下代碼。它適用於循環引用,具有自定義構造函數的對象。

從要序列化的給定對像中,

  • 在遍歷對象時緩存所遇到的所有對象為每個都分配一個唯一的hashID(一個自動遞增的數字也可以工作)
  • 一旦找到一個循環引用,將新對像中的該字段標記為循環,並將原始對象的hashID存儲為屬性。

    Github Link - DecycledJSON

      DJSHelper = {}; DJSHelper.Cache = []; DJSHelper.currentHashID = 0; DJSHelper.ReviveCache = []; //沒有SERIALIZE FUNCTION函數DJSNode(name,object,isRoot){this.name = name; // [ATTRIBUTES]包含Node的原始字段this.attributes = {}; // [CHILDREN]包含節點的Object / Typed字段//所有[CHILDREN]必須是[DJSNode]類型this.children = []; //僅限DJSNodes數組//如果[IS-ROOT]為真,則在編碼之前重置Cache和currentHashId // isRoot = typeof isRoot ==='undefined'?真:isRoot; this.isRoot = isRoot; if(isRoot){DJSHelper.Cache = []; DJSHelper.currentHashID = 0; // CACHE THE ROOT object.hashID = DJSHelper.currentHashID ++; DJSHelper.Cache.push(對象); for(對像中的var a){if(object.hasOwnProperty(a)){var val = object [a]; if(typeof val ==='object'){// IF OBJECT OR NULL REF。/ ******************* ************************** / //不要刪除[FALSE],因為它會重置[DJSHELPER.CACHE] //和THE結果會溢出/ ********************************************* ******************************* / if(val!== null){if(DJSHelper.Cache.indexOf(val) )=== -1){//不在高速緩存中//首先加速到高速緩存 - &gt; 在做回歸之前val.hashID = DJSHelper.currentHashID ++; //console.log("Assigned“,val.hashID,”to“,a); DJSHelper.Cache。推(VAL); if(!(val instanceof Array)){// VAL NOT AN [ARRAY] try {this.children.push(new DJSNode(a,val,false)); } catch(err){console.log(err.message,a); 扔錯了; }} else {// VAL IS AN [ARRAY] var node = new DJSNode(a,{array:true,hashID:val.hashID //數組的HashID},false); val.forEach(function(elem,index){node.children.push(new DJSNode(“elem”,{val:elem},假)); }); this.children.push(節點); }} else {// VAL IN CACHE //添加帶有HASH-ID的循環節點this.children.push(新DJSNode(a,{cyclic:true,hashID:val.hashID},false)); }} else {// PUT NULL as a ATTRIBUTE this.attributes [a] ='null'; 如果(typeof val!=='function'){//必須是一個基元//添加它作為屬性this.attributes [a] = val; if(isRoot){DJSHelper。Cache = null; } this.constructorName = object.constructor.name; } DJSNode.Revive = function(xmlNode,isRoot){// [isRoot]的默認值為True isRoot = typeof isRoot ==='undefined'?true:isRoot; var root; if(isRoot){DJSHelper.ReviveCache = []; //垃圾收集} if(window [xmlNode.constructorName] .toString()。indexOf('[native code]')&gt; -1){//是的,在瀏覽器中是本機的if(xmlNode.constructorName =='Object '){root = {}; } else {return null; } else {eval('root = new'+ xmlNode.constructorName +“()”); } // CACHE ROOT INTO REVIVE-CACHE DJSHelper.ReviveCache [xmlNode.attributes.hashID] = root; for(var x in xmlNode。屬性){// PRIMITIVE OR NULL REF FIELDS if(xmlNode.attributes.hasOwnProperty(k)){var a = xmlNode.attributes [k]; if(a =='null'){root [k] = null; } else {root [k] = a; xmlNode.children.forEach(function(value){//每個子節點是一個[DJSNode] // [Array]存儲為[DJSNode],具有正數組屬性//所以值為if(value.attributes .array){// ITS AN [ARRAY] root [value.name] = []; value.children.forEach(function(elem){root [value.name] .push(elem.attributes.val);}) ; //console.log("Caching“,value.attributes.hashID); DJSHelper.ReviveCache [value.attributes。hashID] = root [value.name]; } else if(!value.attributes.cyclic){// ITS AN [OBJECT] root [value.name] = DJSNode.Revive(value,false); //console.log("Caching“,value.attributes.hashID); DJSHelper.ReviveCache [value.attributes.hashID] = root [value.name]; }}; // [單獨迭代]確保所有可能// [循環]參考被正確緩存xmlNode.children.forEach(function(value){//每個子節點是[DJSNode] // [Array]存儲為[ DJSNode]具有正數組屬性//所以是值if(value.attributes.cyclic){// ITS AND [CYCLIC] REFERENCE root [value.name] = DJSHelper.ReviveCache [value.attributes.hashID];}}) ; if(isRoot){DJSHelper.ReviveCache = null; // Garbage Collect}返回root; }; DecycledJSON = {}; DecycledJSON.stringify = function(obj){return JSON.stringify(new DJSNode(“root”,obj)); }; DecycledJSON.parse = function(json,replacerObject){//使用replacerObject獲取空值返回DJSNode.Revive(JSON.parse(json)); }; DJS = DecycledJSON;   

    示例用法1:

      var obj = {id:201,box:{owner:null,key:' storm'},lines:['item1',23]}; 的console.log(OBJ); // ORIGINAL // SERIALIZE AND THEN PARSE var jsonObj = DJS.stringify(obj); 的console.log(DJS.parse(jsonObj));   

    示例用法2:

      // PERSON OBJECT函數Person(){this.name = null; this.child = null; this.dad = null; this.mom = null; } var Dad = new Person(); Dad.name ='John'; var Mom = new Person(); Mom.name ='莎拉'; var Child = new Person(); Child.name ='Kiddo'; Dad.child = Mom.child =孩子; Child.dad =爸爸; Child.mom =媽媽; 的console.log(兒童); // ORIGINAL // SERIALIZE AND THEN PARSE var jsonChild = DJS.stringify(Child); 的console.log(DJS.parse(jsonChild));   媽媽=媽媽; 的console.log(兒童); // ORIGINAL // SERIALIZE AND THEN PARSE var jsonChild = DJS.stringify(Child); 的console.log(DJS.parse(jsonChild));   媽媽=媽媽; 的console.log(兒童); // ORIGINAL // SERIALIZE AND THEN PARSE var jsonChild = DJS.stringify(Child); 的console.log(DJS.parse(jsonChild));  
         
    			
            
9楼
0
has(value))返回objMap.get(value); objMap.set(value,`ref $ {objMap.size + 1}`); 返回值; }); 返回字符串; },refParse:{value:function(str){let parsed = JSON.parse(str); 讓objMap = _createObjectMap(解析); objMap.forEach((value,key)=&gt; _replaceKeyWithObject(value,key)); 返回解析; }},}); // ***************************示例讓a = {b:32,c:{get a(){return a; },獲取c(){return ac; }}; let stringified = JSON.refStringify(a); let parsed = JSON.refParse(stringified,2); console.log(已解析,JSON.refStringify(已解析)); // *************************** /示例// ***************** **********輔助函數_createObjectMap(obj){let objMap = new Map(); JSON.stringify(obj,(key,value)=&gt; {if(typeof value =='object'){if(objMap.has(value))return objMap.get(value); objMap.set(value,` ref $ {objMap.size + 1}`);}返回值;}); return objMap; function _replaceKeyWithObject(key,obj,replaceWithObject = obj){Object.keys(obj).forEach(k =&gt; {let val = obj [k]; if(val == key)return(obj [k] = replaceWithObject ); if(typeof val =='object'&amp;&amp; val!= replaceWithObject)_replaceKeyWithObject(key,val,replaceWithObject);}); } {if(typeof value =='object'){if(objMap.has(value))return objMap.get(value); objMap.set(value,`ref $ {objMap.size + 1}`); 返回值; }); return objMap; function _replaceKeyWithObject(key,obj,replaceWithObject = obj){Object.keys(obj).forEach(k =&gt; {let val = obj [k]; if(val == key)return(obj [k] = replaceWithObject ); if(typeof val =='object'&amp;&amp; val!= replaceWithObject)_replaceKeyWithObject(key,val,replaceWithObject);}); } {if(typeof value =='object'){if(objMap.has(value))return objMap.get(value); objMap.set(value,`ref $ {objMap.size + 1}`); 返回值; }); return objMap; function _replaceKeyWithObject(key,obj,replaceWithObject = obj){Object.keys(obj).forEach(k =&gt; {let val = obj [k]; if(val == key)return(obj [k] = replaceWithObject ); if(typeof val =='object'&amp;&amp; val!= replaceWithObject)_replaceKeyWithObject(key,val,replaceWithObject);}); } replaceWithObject = obj){Object.keys(obj).forEach(k =&gt; {let val = obj [k]; if(val == key)return(obj [k] = replaceWithObject); if(typeof val == 'object'&amp;&amp; val!= replaceWithObject)_replaceKeyWithObject(key,val,replaceWithObject);}); } replaceWithObject = obj){Object.keys(obj).forEach(k =&gt; {let val = obj [k]; if(val == key)return(obj [k] = replaceWithObject); if(typeof val == 'object'&amp;&amp; val!= replaceWithObject)_replaceKeyWithObject(key,val,replaceWithObject);}); }
10楼
0

試試這個:

  var obj = {a:“foo”,b:obj}; var circular_replacer =(value)=&gt; {var seen = []; if(value!= null&amp;&amp; typeof value ==“object”){if(seen.indexOf(value)&gt; = 0)return; seen.push(值); 返回值; }; obj = circular_replacer(obj);  
     
			
        

在see.push(value)= -D之後,不應該有更多的代碼行嗎?喜歡(var key in value){value [key] = circular_replacer(value [key]);} - Artur Klesun Dec 11 '18 at 19:42

不鼓勵使用僅代碼的答案。請單擊編輯並添加一些詞彙總結您的代碼如何解決問題,或者解釋您的答案與之前的答案/答案有何不同。點評來源 - 尼克12月11日18:31

11楼
0

儘管已經對此做了充分的回答,但您還可以使用 delete 運算符在字符串化之前顯式刪除相關屬性。

 刪除obj.b; const jsonObject = JSON.stringify(obj);   

刪除運算符

這將消除構建或維護複雜邏輯以刪除循環引用的需要。