使用forEach将对象推入数组

时间:2020-04-17 14:21:22

标签: javascript object foreach

我有一个on单击事件,它会更改要合并为类似json的对象的三个元素的值:

/**
 * getRefsList
 * Doc: https://docs.microsoft.com/en-us/rest/api/azure/devops/git/refs/list?view=azure-devops-rest-5.1#refs
 *
 * @param $branch
 * @return bool|string
 */
function getRefsList($branch){
    global $baseUri;
    global $organization;
    global $project;
    global $repositoryId;
    global $username;
    global $accessToken;
    //GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/refs?api-version=5.1
    $url = $baseUri . '/' . $organization . '/' . $project . '/_apis/git/repositories/' . $repositoryId . '/refs?api-version=5.1';
    $queryArr = [
        'filter' => 'heads/' . $branch,
    ];
    if(!empty($queryArr)){
        $queryStr = http_build_query($queryArr);
        $url .= '&' . $queryStr;
    }
    // echo($url);exit;
    $authorization = 'basic ' . base64_encode($username . ':' . $accessToken);
    // echo $url;exit;
    $ch = curl_init();
    $options = [
        CURLOPT_URL => $url,
        CURLOPT_HTTPHEADER => [
            'authorization: ' . $authorization
        ],
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => 0,
    ];
    //In case you need a proxy
    // $options[CURLOPT_PROXY] = 'http://127.0.0.1:1087';
    curl_setopt_array($ch, $options);
    $responseJson = curl_exec($ch);
    if(curl_errno($ch)){
        echo 'Error: ' . curl_error($ch);
    }
    $retArr = json_decode($responseJson, true);
    curl_close($ch);
    $refs = [];
    if(isset($retArr['count']) && $retArr['count'] > 0){
        $refs = $retArr['value'];
    }
    return $refs;
}

/**
 * getObjectIdOfRef
 * @param $branch
 *
 * @return mixed|string
 */
function getObjectIdOfRef($branch){
    $refs = getRefsList($branch);
    $objectId = '';
    if($refs){
        foreach($refs as $ref){
            if($ref['name'] == 'refs/heads/'.$branch){
                $objectId = $ref['objectId'];
                break;
            }
        }
    }
    return $objectId;
}

/**
 * create a file in the specified repo and branch
 * Doc: https://docs.microsoft.com/en-us/rest/api/azure/devops/git/pushes/create?view=azure-devops-rest-5.1
 * @param $uploadFilePath
 * @param $path
 *
 * @return mixed
 */
function create($uploadFilePath, $path){
    global $baseUri;
    global $organization;
    global $project;
    global $repositoryId;
    global $branch;
    global $username;
    global $accessToken;
    $url = $baseUri . '/' . $organization . '/' . $project . '/_apis/git/repositories/' . $repositoryId . '/pushes?api-version=5.1';
    $authorization = 'basic ' . base64_encode($username . ':' . $accessToken);
    //$url sample: https://dev.azure.com/kmx3ecup/img_bed/_apis/git/repositories/img_bed/pushes?api-version=5.1&searchCriteria.refName=&searchCriteria.includeRefUpdates=false&$top=1
    // echo $url;exit;
    $oldObjectId = getObjectIdOfRef($branch);
    // var_dump($oldObjectId);exit;
    $postFields = [
        'refUpdates' => [
            [
                'name'=> 'refs/heads/' . $branch,
                'oldObjectId' => $oldObjectId,
            ],
        ],
        'commits' => [
            [
                'comment' => 'This is a test push',
                'changes' => [
                    [
                        //add, edit, delete
                        'changeType' => 'add',
                        'item' => [
                            'path' => $path,
                        ],
                        'newContent' => [
                            'content' => base64_encode(file_get_contents($uploadFilePath)),
                            'contentType' => 'base64encoded'
                        ]
                    ]
                ],
            ],
        ],
    ];

    $ch = curl_init();
    $options = [
        CURLOPT_URL => $url,
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => [
            'authorization: ' . $authorization,
            'content-type: application/json',
        ],
        CURLOPT_POSTFIELDS => json_encode($postFields),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => 0,
    ];
    //In case you need a proxy
    // $options[CURLOPT_PROXY] = 'http://127.0.0.1:1087';
    curl_setopt_array($ch, $options);
    $responseJson = curl_exec($ch);
    if(curl_errno($ch)){
        echo 'Error: ' . curl_error($ch);
    }
    curl_close($ch);
    return json_decode($responseJson, true);
}

$baseUri = 'https://dev.azure.com';
$organization = '<YOUR_ORGANIZATION>';
$project = '<YOUR_PROJECT_NAME>';
$repositoryId = '<YOUR_REPOSITORY_ID_OR_REPOSITORY_NAME>';
$branch = 'master';
$username = '<YOUR_USERNAME>';
$accessToken = '<YOUR_ACCESS_TOKEN>';
$uploadFilePath = '/path/to/test.jpg';
$path = '/images/' . date('Y/m/d') . '/' . basename($uploadFilePath);
$retArr = create($uploadFilePath, $path);

$publicUrl = $retArr['repository']['url'] . '/items?path=' . $path . '&versionDescriptor[versionOptions]=0&versionDescriptor[versionType]=0&versionDescriptor[version]=' . $branch . '&resolveLfs=true&$format=octetStream&api-version=5.0';

echo $publicUrl;
function generateNumbers() {
  let a = Math.random()
  let b = Math.random()
  let c = Math.random()
  console.log({
    "numbers": [
      {"a": a, "b": b, "c": c}
    ]
  })
}

我要取代每次单击添加另一个对象<button onclick="generateNumbers()">Three Numbers</button>,而不是替换abc。这可能吗?

所需的输出

{"a": a, "b": b, "c": c}

3 个答案:

答案 0 :(得分:1)

您需要创建一个包含numbers属性作为数组的初始对象,您可以在其中使用abc属性推送新生成的对象。了解有关.push()的信息:

push()方法将一个或多个元素添加到数组的末尾并返回该数组的新长度。

尝试以下操作:

const data = {
   numbers: []
};

function generateNumbers() {
  let a = Math.random()
  let b = Math.random()
  let c = Math.random()
  
  data.numbers.push({"a": a, "b": b, "c": c});
  
  console.log(data);
}
<button onclick="generateNumbers()">Three Numbers</button>

我希望这会有所帮助!

答案 1 :(得分:0)

您需要为generateNumbers函数外部的数字添加一个变量。

const state = { numbers: [] }

function generateNumbers() {
  let a = Math.random()
  let b = Math.random()
  let c = Math.random()
  
  state.numbers.push({ a, b, c })

  console.log(state)
}
<button onclick="generateNumbers()">Three Numbers</button>

答案 2 :(得分:0)

您需要在函数之外定义对象,并将numbers中设置的新值推送到generateNumbers

const data = { numbers: [] }

function generateNumbers(){
  const val = Math.random;
  data.numbers.push({ a: val(), b: val(), c: val() )})
}