2017-01-12 4 views
-3

мне нужно сделать добавление с помощью NodeJS в массиве JSON, а затем возвращает измененную JSON, как это, мне нужно также проверить, если ключ существует или не обойтись без исключений:Добавление ключей в формате JSON

JSON:

{ 
    "cmd": [ 
     { 
      "sales": [ 
       { 
        "qte1": "2", 
        "qte2": "3", 
        "someString": "test 
       }, 
       { 
        "qte1": "66", 
        "someAttribute": "test " 
       }, 
       { 
        "qte2": "77", 
        "toto": "tata" 
       } 
      ] 
     } 
    ] 
} 

цель JSON:

{ 
    "cmd": [ 
     { 
      "sales": [ 
       { 
        "qte1": "2", 
        "qte2": "3", 
        "somme": "5" 
       }, 
       { 
        "qte1": "66", 
        "somme": "66" 

       }, 
       { 
        "qte2": "77", 
        "somme": "77" 
       } 
      ] 
     } 
    ] 
} 

мне нужно добавить два ключевых qte1 и др qte2 вы имеете любые предложения?

С наилучшими пожеланиями

+0

сделать у вас есть некоторые попытки? –

+0

Да, но я хочу сделать это в рекурсивном соответствии –

+0

В JavaScript вы можете преобразовать json в объекты с помощью 'JSON.parse()' и наоборот с помощью 'JSON.stringify()'. Измените объект, а затем снова преобразуйте его в строку/JSON. – angrykoala

ответ

3

Похоже, вы просто хотите, сумма существующих ключей, должно быть довольно просто с помощью пары .map команд и .reduce:

return json.cmd.map(function(salesList) { 
    return salesList.sales.map(function(sale) { 
     var keysToAdd = ["qte1", "qte2"]; 

     sale.somme = Object.keys(sale).reduce(function(total, key) { 
      return total += keysToAdd.indexOf(key) > -1 ? +sale[key] : 0; 
     }, 0); 

     return sale; 
    }); 
}); 

Демо: https://jsfiddle.net/x294yt1h/

+0

Спасибо @tymeJV это работает. Я сделал это в цикле, но это не элегантно, как ваш –

+0

, но в объекте у него будут другие ключи, которые он не будет добавлен в общей сложности –

+0

@AmineHatim - Тогда этот подход не будет работать - на основе вашего примера я предположил, что все ключи необходимо будет добавить. – tymeJV

1
const data = 
{ 
    "cmd": [ 
     { 
      "sales": [ 
       { 
        "qte1": "2", 
        "qte2": "3" 
       }, 
       { 
        "qte1": "66" 
       }, 
       { 
        "qte2": "77" 
       } 
      ] 
     } 
    ] 
}; 

function sum(dataObj) { 
    const hasCmd = dataObj && dataObj.cmd && dataObj.cmd.length > 0; 
    const hasSales = hasCmd && dataObj.cmd[0].sales && dataObj.cmd[0].sales.length > 0; 
    if (hasCmd && hasSales) { 
     const clonedArray = dataObj.cmd[0].sales.slice(); 
     const summedArray = clonedArray.map(function(group) { 
      const groupKeys = Object.keys(group); 
      const sum = groupKeys.reduce(function (total, key) { 
       return total + parseInt(group[key], 10 /* Decimal Radix */); 
      }, 0); 
      return Object.assign({}, group, { 'somme': sum.toString() }); 
     }); 
     // build a new object to return to include new summed array 
     return { "cmd": [{ "sales": summedArray }] }; 
    } 
    return dataObj; 
} 

console.log('data', JSON.stringify(data)); 
const newData = sum(data); 
console.log('newData', JSON.stringify(newData)); 
+0

Спасибо @Rob Brander Я думаю, что мой вопрос был не очень ясен Я меняю JSON –

0

Возможно, вы можете сначала и formost refector ваше дерево.

Как что:

{ 
 
    command: [ 
 
    { 
 
     sales: [ 
 
     { 
 
      quantity: [1, 2, 4], 
 
      sum: 7 
 
     } 
 
     ] 
 
    } 
 
    ] 
 
}
Я не знаю, если ваша структура открыта для любого refectoring, но вы должны сделать что-то об этом!

Однако, попробуйте использовать правильный тип значения в вашем ряду, и попытаться иметь в виду, никогда не мутировать и объект, использовать функтор как карты и уменьшить:

const cmd = [ 
 
    { 
 
    sales: [ 
 
     { 
 
      quantity: [1, 2, 3], 
 
      sum: 0 
 
     }, 
 
     { 
 
      quantity: [67, 2, 3], 
 
      sum: 0 
 
     } 
 
    ] 
 
    } 
 
]; 
 

 
const newObjectWithSum = cmd.map(sales => { 
 
    return sales.sales.map((sale) => { 
 
    sale.sum = sale.quantity.reduce((valueIn, next) => { 
 
     return valueIn + next; 
 
    },0); 
 
    return sale; 
 
    }); 
 
})

+0

Спасибо @Steven leclerc Я думаю, что мой вопрос не ясен Я изменяю JSON –