Как скопировать данные из старого json в новый json в javascript?

#javascript #arrays #json #object

#javascript #массивы #json #объект

Вопрос:

у меня есть json. мне нужно скопировать содержимое «данных», если поставщиком являются «ДАННЫЕ ОСИ», в новый файл json. Как?

то, что я пробовал, это

сначала я конвертирую с помощью json.parse и ищу его с помощью цикла for.

пока это мой код

 var hasilsearching = {};
var hasildata = JSON.parse( FIRST JSON );
for (var i=0 ; i < hasildata.data.length ; i  ){
    if (hasildata.data[i].provider == "AXIS DATA") {
        hasilsearching = hasildata.data[i];
    }   
}
  

но не то, что я ожидал. Я знаю, что проблема внутри if() . но я не знаю.

это мой файл json

 {
    "errNumber": "0",
    "userID": "EKL0003097",
    "data": [
        {
            "code": "BXD1",
            "price": "15000.00",
            "name": "Voucher Axis Aigo 1GB 24J 30H",
            "ep": "770",
            "isActive": "Active",
            "type": "KUOTA",
            "provider": "AXIS DATA"
        },
        {
            "code": "BXD2",
            "price": "25000.00",
            "name": "Voucher Axis Aigo 2GB 24J 30H",
            "ep": "660",
            "isActive": "Active",
            "type": "KUOTA",
            "provider": "AXIS DATA"
        },
    {
            "code": "BOLT1",
            "price": "31000.00",
            "name": "Bolt Kuota 1,5GB 24Jam 30hr",
            "ep": "1320",
            "isActive": "Active",
            "type": "KUOTA",
            "provider": "BOLT"
        },
        {
            "code": "BOLT3",
            "price": "50000.00",
            "name": "Bolt Kuota 3GB 24Jam 30hr",
            "ep": "1127",
            "isActive": "Active",
            "type": "KUOTA",
            "provider": "BOLT"
        }
    ],
    "respMessage": "PROSES BERHASIL"
}
  

это ожидаемый новый файл json

 {
    "data": [
        {
            "code": "BXD1",
            "price": "15000.00",
            "name": "Voucher Axis Aigo 1GB 24J 30H",
            "ep": "770",
            "isActive": "Active",
            "type": "KUOTA",
            "provider": "AXIS DATA"
        },
        {
            "code": "BXD2",
            "price": "25000.00",
            "name": "Voucher Axis Aigo 2GB 24J 30H",
            "ep": "660",
            "isActive": "Active",
            "type": "KUOTA",
            "provider": "AXIS DATA"
        }
    ]
}
  

Комментарии:

1. hasilsearching = hasildata.data[i]; должно быть hasilsearching['data'][] = hasildata.data[i];

Ответ №1:

Добавьте пустой массив в data свойство hasilsearching и push любые совпадения на:

 var hasildata = {"errNumber":"0","userID":"EKL0003097","data":[{"code":"BXD1","price":"15000.00","name":"Voucher Axis Aigo 1GB 24J 30H","ep":"770","isActive":"Active","type":"KUOTA","provider":"AXIS DATA"},{"code":"BXD2","price":"25000.00","name":"Voucher Axis Aigo 2GB 24J 30H","ep":"660","isActive":"Active","type":"KUOTA","provider":"AXIS DATA"},{"code":"BOLT1","price":"31000.00","name":"Bolt Kuota 1,5GB 24Jam 30hr","ep":"1320","isActive":"Active","type":"KUOTA","provider":"BOLT"},{"code":"BOLT3","price":"50000.00","name":"Bolt Kuota 3GB 24Jam 30hr","ep":"1127","isActive":"Active","type":"KUOTA","provider":"BOLT"}],"respMessage":"PROSES BERHASIL"};

var hasilsearching = { data: [] };
for (var i=0 ; i < hasildata.data.length ; i  ){
  if (hasildata.data[i].provider == "AXIS DATA") {
    hasilsearching.data.push(hasildata.data[i]);
  }   
}

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

Это также намного проще в использовании filter :

 var hasildata = {"errNumber":"0","userID":"EKL0003097","data":[{"code":"BXD1","price":"15000.00","name":"Voucher Axis Aigo 1GB 24J 30H","ep":"770","isActive":"Active","type":"KUOTA","provider":"AXIS DATA"},{"code":"BXD2","price":"25000.00","name":"Voucher Axis Aigo 2GB 24J 30H","ep":"660","isActive":"Active","type":"KUOTA","provider":"AXIS DATA"},{"code":"BOLT1","price":"31000.00","name":"Bolt Kuota 1,5GB 24Jam 30hr","ep":"1320","isActive":"Active","type":"KUOTA","provider":"BOLT"},{"code":"BOLT3","price":"50000.00","name":"Bolt Kuota 3GB 24Jam 30hr","ep":"1127","isActive":"Active","type":"KUOTA","provider":"BOLT"}],"respMessage":"PROSES BERHASIL"};

var hasilsearching = { data: hasildata.data.filter(({ provider }) => provider == "AXIS DATA") };

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

Комментарии:

1. спасибо за ответ, это сработало. Использовать фильтр — это здорово.

2. привет, извините за поздний ответ. Когда я использую filter в ответе выше, я получаю предупреждающее сообщение. В нем говорится, что ‘деструктурирующая привязка’ доступна в ES6 (используйте ‘esversion: 6’), а ‘синтаксис функции стрелки (=>)’ доступен только в ES6 (используйте ‘esversion: 6’) как я избавляюсь от этого предупреждения?

Ответ №2:

Вы можете просто фильтровать свои данные таким образом:

 let filteredData = hasildata.data.filter(x => x.provider=='AXIS DATA');
  

Ответ №3:

Используя цикл forEach

 var data={
    "errNumber": "0",
    "userID": "EKL0003097",
    "data": [
        {
            "code": "BXD1",
            "price": "15000.00",
            "name": "Voucher Axis Aigo 1GB 24J 30H",
            "ep": "770",
            "isActive": "Active",
            "type": "KUOTA",
            "provider": "AXIS DATA"
        },
        {
            "code": "BXD2",
            "price": "25000.00",
            "name": "Voucher Axis Aigo 2GB 24J 30H",
            "ep": "660",
            "isActive": "Active",
            "type": "KUOTA",
            "provider": "AXIS DATA"
        },
    {
            "code": "BOLT1",
            "price": "31000.00",
            "name": "Bolt Kuota 1,5GB 24Jam 30hr",
            "ep": "1320",
            "isActive": "Active",
            "type": "KUOTA",
            "provider": "BOLT"
        },
        {
            "code": "BOLT3",
            "price": "50000.00",
            "name": "Bolt Kuota 3GB 24Jam 30hr",
            "ep": "1127",
            "isActive": "Active",
            "type": "KUOTA",
            "provider": "BOLT"
        }
    ],
    "respMessage": "PROSES BERHASIL"
}
var d={data:[]}
data.data.forEach(e=>{
if(e.provider=="AXIS DATA")
d.data.push(e)
})  

Ответ №4:

если вы хотите поместить свои поля в массив, используйте следующее :

 var data = [];
for(var el of myjson.data){
  if(el.provider === "AXIS DATA"){    
    data.push(JSON.parse(JSON.stringify(el)));
  }
}
  

Комментарии:

1. Это не сработает — myjson.data это массив объектов , а не отдельный объект. Вот почему требуется какой-то цикл.

2. @JackBashford спасибо, что указали на это, я обновил свой ответ