Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从资产的一个数组字段中删除一个JSON后,无法更新避难所注册表_Javascript_Blockchain_Hyperledger Composer - Fatal编程技术网

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);
       }
   }
   */