通过密钥推送到JavaScript数组

时间:2016-01-28 11:59:57

标签: javascript arrays

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

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

我只是想通过提供键值来推送到其中一个数组。

我试过了;

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

但是我没有定义。 当然这不是很难,但我在这里或通过JS文档找不到答案

我这样做的原因是因为我正在使用的JS库需要特定方式的数据

5 个答案:

答案 0 :(得分:2)

效率不高但很短:

$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>")
&#13;
&#13;
&#13;

答案 1 :(得分:1)

如果您无法更改结构,则可以使用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);

答案 2 :(得分:-1)

只需使用map功能执行此操作:

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

答案 3 :(得分:-1)

您可以将其创建为对象而不是数组,然后在需要将其传递给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] };
});

Example Fiddle

答案 4 :(得分:-1)

这是可以正常工作的协议。我已经删除了测试的范围

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);