Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正在使用错误属性调用的对象_Javascript_Jquery_Html - Fatal编程技术网

Javascript 正在使用错误属性调用的对象

Javascript 正在使用错误属性调用的对象,javascript,jquery,html,Javascript,Jquery,Html,我目前正在建立一个类似于PCPartPicker的网站,但用于学校项目的水冷部件。我介入了,我遇到了一些问题。最重要的是: 这是我的对象构造函数开始 var cpuCollection = []; var myComputer = []; function CPU(frequency,cores,socket,name) { this.name = name; this.frequency = frequency; this.cores = cores; this

我目前正在建立一个类似于PCPartPicker的网站,但用于学校项目的水冷部件。我介入了,我遇到了一些问题。最重要的是: 这是我的对象构造函数开始

var cpuCollection = [];
var myComputer = [];
function CPU(frequency,cores,socket,name) {
    this.name = name;
    this.frequency = frequency;
    this.cores = cores;
    this.socket = socket;

    cpuCollection.push(this);
}

var i75930k = new CPU(3.6, 6, 2011.3, "i7 5930k");  
var i54690k = new CPU(3.6, 4, 1150, "i5 4960k");`
在我构建了对象构造函数之后,我使用真实的计算机部件制作了一些测试对象

在我的HTML中,我有下拉菜单,这些菜单由使用以下代码加载的对象填充:

$(cpuCollection).each(function() {
    $('#cpusel').append($("<option> " + this.name + "</option>"))
});
不幸的是,此代码当前不起作用,它告诉我当选择了
i75930k
时,
myCPU.socket
1150
,而实际上应该是
2011.3
。我在这里已经智穷到极点了,我想取得一些进展。 提前谢谢你的帮助

编辑:我修复了等号问题,现在我认为问题可能源于我将对象推入cpuCollection数组的方式。当我尝试记录cpuCollection时,我得到了[CPU,CPU],这显然不是我想要的。如何将创建时的CPU对象推送到cpuCollection中,使其所有属性保持不变。

在if()语句中尝试以下操作:

$('#cpusel').change(function() {
myCPU = new CPU();
$(cpuCollection).each(function(){
   if(this.name === $('#cpusel :selected').text()) {
      myCPU = this;
   }
});

因此,您的一些逻辑/语法存在一些问题,我将尝试单独解决这些问题,以便您更好地理解我是如何得到一个有效的解决方案的:

1) 将元素从对象定义内部推送到数组中。这通常是一种不好的做法,因为它是不可重用的,如果在实例化CPU对象实例之前未定义名为
cpuCollection
的数组,则会引发错误。最好说
cpuCollection.push(新CPU(…)

2) 将选项附加到下拉列表时,还应添加
value
属性,以便更轻松地获取#3中的值

3) 如果在
元素上设置value属性,则无需查找所选选项的文本,可以将选择器简化为
$('#cpusel').val()

4) 没有必要通过说
$(cpuCollection)将数组包装到jQuery对象中。每个(…)
,您都可以(也应该)使用内置的vanilla javascript数组操作

5) 我将更改处理程序中的
.each()
更改为
.some()
这是因为当您从
.some()
返回true时,它会停止任何进一步的迭代,这正是您想要的。以前,它将继续循环到最后,即使它已经找到了匹配的CPU

6) 我添加了一个myCPU变量并将其实例化为null,因此如果您在严格模式下运行,您的更改处理程序不会因为之前未定义的变量而引发错误

7) if语句中的逻辑是执行赋值,而不是比较,因为使用了
=
而不是
==或===
,这是一个简单的错误

希望这有帮助

var cpuCollection=[];
var myComputer=[];
var myCPU=null;
功能CPU(频率、核心、插座、名称){
this.name=名称;
这个频率=频率;
这是。核心=核心;
this.socket=socket;
}
cpuCollection.push(新的CPU(3.6,6,2011.3,“I75930K”);
push(新的CPU(3.6,41150,“i5 4960k”);
forEach(函数(cpu,索引){
$('#cpusel')。追加($(''+cpu.name+'')
});
$('#cpusel').change(function(){
myCPU=新CPU();
cpuCollection.some(函数(cpu、索引){
if(cpu.name==$('#cpusel').val()){
myCPU=cpu;
返回true;
}
});
console.log(myCPU);
});

有一个简单的方法:

var cpuCollection=[];
var myComputer=[];
功能CPU(频率、核心、插座、名称){
cpuCollection.push({
姓名:姓名,,
频率:频率,,
核心:核心,
插座:插座
});
}
var i75930k=CPU(3.6,6,2011.3,“i7 5930k”);
变量i54690k=CPU(3.6,41150,“i5 4960k”);
$(cpuCollection)。每个(函数(i,cpu){
var option=$('').html(cpu.name).data('cpu',cpu);
$('#cpusel')。附加(可选);
});
$('#cpusel').change(function(){
var selected=$(this.find('option:selected');
var text=$(选定).text();
var-myCPU;
//您可以简单地使用:myCPU=$(已选择).data(“cpu”)
console.log('via data:',$(已选).data(“cpu”);
$(cpuCollection)。每个(函数(i,cpu){
if($.trim(cpu.name)==$.trim(text)){
myCPU=cpu;
//返回false;=>断开each();
}
});
log('via each:',myCPU);
}); 

看看这个。

你的意思是
this.name==
而不是
this.name=
。查看我的解决方案-应该有助于理解如何修复和优化代码。如果您有任何问题,请告诉我谢谢帮助Rowan,不幸的是,我现在收到一个错误,指出myCPU未定义。让我快速进行一些调试。哦,是的,试试“var myCPU”
$('#cpusel').change(function() {
myCPU = new CPU();
$(cpuCollection).each(function(){
   if(this.name === $('#cpusel :selected').text()) {
      myCPU = this;
   }
});
var cpuCollection = [];
var myComputer = [];

function CPU(frequency,cores,socket,name) {
    cpuCollection.push({
        name:      name,
        frequency: frequency,
        cores:     cores,
        socket:    socket
    });
}

var i75930k = CPU(3.6, 6, 2011.3, "i7 5930k");  
var i54690k = CPU(3.6, 4, 1150,   "i5 4960k");

$(cpuCollection).each(function(i,cpu) {
    var option = $('<option/>').html(cpu.name).data('cpu',cpu);
    $('#cpusel').append(option);
});

$('#cpusel').change(function() {

    var selected = $(this).find('option:selected'); 
    var text = $(selected).text();
    var myCPU;

    // You can simply use : myCPU = $(selected).data("cpu")
    console.log('via data:',$(selected).data("cpu"));

    $(cpuCollection).each(function(i,cpu){
        if($.trim(cpu.name) == $.trim(text)) {
           myCPU = cpu;
           // return false; ==> break the each();
        }
    });
    console.log('via each:',myCPU);
});