有没有更简单的方法来推送到JSON数组或创建不存在的数组?

时间:2019-03-28 03:32:16

标签: javascript arrays json object

我有一个函数,该函数接受一个JSON对象,并使用初始元素创建一个新数组,或者如果该元素已经存在,则向该数组添加一个元素:

function pushOrCreate(jsonObj,arrayName,newElement){
    if(jsonObj.hasOwnProperty(arrayName)){
        jsonObj[arrayName].push(newElement);
    }
    else{
        jsonObj[arrayName]=[newElement];
    }
}

这是对该功能的测试:

var taskAttributesText='{'+
'"abc":"123",'+
'"xyz":"hello"'+
'}';
var taskAttributes=JSON.parse(taskAttributesText);
pushOrCreate(taskAttributes,"workers","xx8238429");
pushOrCreate(taskAttributes,"workers","aa238232");
console.log(JSON.stringify(taskAttributes));

该功能正常运行,但是我认为必须有一种更简单的方法来完成此“推入或创建”操作-似乎Java中有一种单行解决方案。有更简单的方法吗?

4 个答案:

答案 0 :(得分:2)

Forget IFs。如何破坏分配和默认值-

const pushOrCreate = (key, { [key]:arr = [], ...o }, v) =>
  ({ ...o, [key]: [...arr, v] })

console.log(pushOrCreate('foo', {}, 1))
// { foo: [ 1 ] }

console.log(pushOrCreate('foo', {foo: [1]}, 2))
// { foo: [ 1, 2 ] }

答案 1 :(得分:1)

只需使用单行条件:

function pushOrCreate(jsonObj,arrayName,newElement){
    jsonObj[arrayName] ? jsonObj[arrayName].push(newElement) : jsonObj[arrayName] = [newElement];
}

答案 2 :(得分:1)

您可以使用Ternary Operator

function pushOrCreate(jsonObj,arrayName,newElement){
    jsonObj.hasOwnProperty(arrayName) ? jsonObj[arrayName].push(newElement) : jsonObj[arrayName]=[newElement]
}


var taskAttributesText='{'+
    '"abc":"123",'+
    '"xyz":"hello"'+
'}';
var taskAttributes=JSON.parse(taskAttributesText);
pushOrCreate(taskAttributes,"workers","xx8238429");
pushOrCreate(taskAttributes,"workers","aa238232");
console.log(JSON.stringify(taskAttributes));

答案 3 :(得分:0)

在这里您还有另一种选择,但是它不是唯一的,而是有助于消除if-else块:

function pushOrCreate(jsonObj, arrayName, newElement)
{
    jsonObj[arrayName] = jsonObj.hasOwnProperty(arrayName) ? jsonObj[arrayName] : [];
    jsonObj[arrayName].push(newElement);
}

var taskAttributesText = '{' + '"abc":"123",' + '"xyz":"hello"' + '}';

var taskAttributes = JSON.parse(taskAttributesText);
pushOrCreate(taskAttributes, "workers", "xx8238429");
pushOrCreate(taskAttributes, "workers", "aa238232");
console.log(taskAttributes);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

但是,如果您仍然希望将其放在一行上,则可以执行以下操作:

function pushOrCreate(jsonObj, arrayName, newElement)
{
    (jsonObj[arrayName] = jsonObj.hasOwnProperty(arrayName) ? jsonObj[arrayName] : []).push(newElement);
}