Javascript 从资产的一个数组字段中删除一个JSON后,无法更新避难所注册表
我想删除Javascript 从资产的一个数组字段中删除一个JSON后,无法更新避难所注册表,javascript,blockchain,hyperledger-composer,Javascript,Blockchain,Hyperledger Composer,我想删除 { "$class": "org.disaster.model.Shelter", "Shelter_Id": "1", "resident": [ { "$class": "org.disaster.model.ResidentUpdate", "Name": "Nisi consequat et.", "Contact": "Magna duis.", "Biometric": "NiOmW=",
{
"$class": "org.disaster.model.Shelter",
"Shelter_Id": "1",
"resident":
[
{
"$class": "org.disaster.model.ResidentUpdate",
"Name": "Nisi consequat et.",
"Contact": "Magna duis.",
"Biometric": "NiOmW=",
"BloodGroup": "Voluptate pariatur exercitation elit."
},
{
"$class": "org.disaster.model.ResidentUpdate",
"Name": "Amet et exercitation adipisicing non.",
"Contact": "Lorem dolor deserunt quis.",
"Biometric": "BhyWI=",
"BloodGroup": "Et non minim commodo consectetur."
}
]
}
此JSON通过查询生物特征字段实现
在控制台中,它正确地到来了
但我得到了一个错误:
当我尝试更新庇护所时,需要资源或概念
登记处
(可能是因为我试图更新结果字段,该字段是一个变量,但我不知道如何在此处使用概念或资源。)
**似乎适用于所有版本的游乐场。在使用Chrome的Windows上进行测试
{
"$class": "org.disaster.model.ResidentUpdate",
"Name": "Nisi consequat et.",
"Contact": "Magna duis.",
"Biometric": "NiOmW=",
"BloodGroup": "Voluptate pariatur exercitation elit."
}
##Script.js##
/**
*更新状态
*@param{org.disaster.model.changeshelterstatus}人
*@交易
*/
异步函数ChangeShelterStatus(人员){
var factory=getFactory();
叶绿体
const resident=wait query('selectResidentByBiometric',{'biometric':people.biometric});
var email=resident[0]。resident\u email
var residentRegistry=await getparticipantergistry('org.disaster.model.Resident');
var residentObj=等待residentRegistry.get(电子邮件);
控制台日志(residentObj.遮蔽物)
如果(居住区遮蔽物长度>0){
对于(var k=0;k我认为您的代码可以简单得多(不确定您是否需要编写其他函数等),但下面是一个示例-您可以转换到您的环境中(我没有您的模型)。下面的函数应该负责为新修改的数组编制索引
ps.(您的是一个包含JSON元素的概念数组,但我在这里发布了一个简单的数组示例,仅供参考):
考虑到这个简单的模型
> ##Script.js##
/**
* updateShelterStatus
* @param {org.disaster.model.changeshelterstatus} people
* @transaction
*/
async function ChangeShelterStatus(people) {
var factory = getFactory();
var shelterId
const resident = await query('selectResidentByBiometric',{'biometric': people.Biometric});
var email=resident[0].Resident_Email
var residentRegistry = await getParticipantRegistry('org.disaster.model.Resident');
var residentObj = await residentRegistry.get(email);
console.log(residentObj.shelter)
if(residentObj.shelter.length>0){
for(var k=0;k<residentObj.shelter.length;k++){
console.log("OLD"+residentObj.shelter[k].Status)
shelterId=residentObj.shelter[k].shelterId.getIdentifier()
console.log("Shelter Id"+shelterId)
residentObj.shelter[k].Status='Moved'
console.log("New"+residentObj.shelter[k].Status)
await residentRegistry.update(residentObj)
console.log("Updated")
}
}
else{
alert("First Entry")
}
for(var j=0;j<residentObj.shelter.length;j++){
var shelterRegistry = await getAssetRegistry('org.disaster.model.Shelter');
var shelterObj=await shelterRegistry.get(shelterId);
for(var i=0;i<shelterObj.resident.length;i++){
if(shelterObj.resident[i].Resident_Email==email){
console.log(shelterObj.resident,shelterObj.resident[i])
remove_array_value(shelterObj.resident,shelterObj.resident[i]);
}}}
}
async function remove_array_value(array, value) {
console.log("In Remove")
var index = array.indexOf(value);
if (index >= 0) {
array.splice(index,1);
reindex_array(array);
}
}
async function reindex_array(array) {
console.log("In ReIndex")
var shelterRegistry = await getAssetRegistry('org.disaster.model.Shelter');
var result = [];
for (var key in array) {
result.push(array[key]);
}
await shelterRegistry.update(result)
console.log("After delete")
}
> ##Model File##
transaction changeshelterstatus{
o String Biometric
}
事务模型如下所示:
asset Tradeable identified by id {
o String id
o conArray[] myArray
}
concept conArray {
o String mystring1
o String mystring2
}
我更新一个数组(概念数组中的多个元素或单个元素)的逻辑如下-我已经在本地Composer Dev Fabric环境(v1.1)中对此进行了测试,效果良好
transaction arrTx {
--> Tradeable tradeable
}
因此,您想删除resident[]
概念数组中的一个元素?您能发布您的事务代码+模型吗?这会使问题更容易解决:-)-保罗·奥马奥尼13分钟ago@PaulO'Mahony我已经添加了交易代码和模型。问题已经解决。感谢您的想法。我已经创建了一个资产和交易,更新了资产,并通过交易传递它,删除了字段。
/**
* Sample transaction
* @param {org.example.trading.arrTx} tx
* @transaction
*/
async function myfunc(tx) {
var asset = tx.tradeable;
// removing JSON element from a JSON array by match eg. concept array eg element(s) with a particular field having a value match 'abc'
for (var i =0; i < asset.myArray.length; i++) {
if (asset.myArray[i].mystring1.indexOf('abc') > -1 ) {
asset.myArray.splice(i,1);
// break; // if you only want remove 1st occurrence FYI uncomment this line, otherwise it removes all matching entries from the array
}
}
tx.tradeable.myArray = asset.myArray;
var assetRegistry = await getAssetRegistry('org.example.trading.Tradeable');
await assetRegistry.update(tx.tradeable);
}
/*
if (asset.myArray) {
var index = asset.myArray.indexOf('abc');
if (index >= 0) {
asset.myArray.splice(index,1);
}
}
*/