通过键推送到 JavaScript 数组

Pushing to a JavaScript array via key

本文关键字:JavaScript 数组      更新时间:2023-09-26

我有一个格式化如下的对象;

$scope.data = [
    {
        key: "Control",
        values: [ ]
    },
    {
        key: "Experiment",
        values: [ ]
    }
];

我只是希望能够通过提供它们的键值来推送到这些数组中的任何一个。

我试过了;

$scope.data.keys("Experiment").values.push(thing);

但我被定义不清。当然这并不难,但我在这里或通过 JS 文档找不到答案

我以这种方式这样做的原因是因为我使用的JS库需要以特定方式提供数据

不是很有效率,但很短:

$scope.data.filter(function(v){return v.key == "Experiment"})[0].values.push(thing)

一种快速的方法:

for (var i = $scope.data.length; i--;) {
  if ($scope.data[i].key == "Experiment") {
    $scope.data[i].values.push("one more thing")
    break
  }
}

你应该怎么做:

$scope.data = {
  "Control": [],
  "Experiment": []
}
$scope.data["Experiment"].push("thing")

演示:

var $scope = {}
$scope.data = [{
  key: "Control",
  values: []
}, {
  key: "Experiment",
  values: []
}];
// Short
$scope.data.filter(function(v) {
  return v.key == "Experiment"
})[0].values.push("thing")
// Fast
for (var i = $scope.data.length; i--;) {
  if ($scope.data[i].key == "Experiment") {
    $scope.data[i].values.push("one more thing")
    break
  }
}
// Output for the Demo
document.write("<pre>" + JSON.stringify($scope.data, null, "'t") + "</pre>")
// !!! What you should do:
$scope.data = {
  "Control": [],
  "Experiment": []
}
$scope.data["Experiment"].push("thing")
// Output for the Demo
document.write("<pre>" + JSON.stringify($scope.data, null, "'t") + "</pre>")

如果无法更改结构,可以使用Array#some(ES5)或Array#find(ES2015),两者都可以在旧版浏览器上填充/填充。

Array#some

$scope.data.some(function(entry) {
    if (entry.key == "Experiment") {
        entry.values.push(thing);
        return true;
    }
});

Array#find

$scope.data.find(function(entry) { return entry.key == "Experiment"}).values.push(thing);

Array#find ES2015的箭头功能:

$scope.data.find(entry => entry.key == "Experiment").values.push(thing);

只需使用 map 函数即可执行此操作:

$scope.data.map(function(v){
    if(v.key=='Experiment') {
        v.values.push(thing);
    }
});

您可以将其创建为对象而不是数组,然后在需要将其传递给 JS 库时将其转换为数组。

$scope.data = { 
    "Control" : [ ],
    "Experiment" : [ ]
}
// Convert to array
var converted = [];
for (var key in $scope.data) {
    if ($scope.data.hasOwnProperty(key)) {
        converted.push({ key: key, values: $scope.data[key] });
    }
}
// Or using map
var converted = Object.keys($scope.data).map(function(key) { 
    return { key: key, values: $scope.data[key] };
});

示例小提琴

这是可以正常工作的协议。我已经删除了用于测试的$scope

Array.prototype.addElement = function(key, value){
	for(i = 0; i < this.length; i++){
      if(this[i]['key'] == key){
      	this[i]['values'].push(value);
      }
  }
}
var data = [
    {
        key: "Control",
        values: [ ]
    },
    {
        key: "Experiment",
        values: [ ]
    }
];
data.addElement("Control", "values");
data.addElement("Control", "values1");
data.addElement("Control", "values2");
data.addElement("Experiment", "values3");
console.log(data);