【问题标题】:Looping through a split array and outputting with wrapInner循环通过拆分数组并使用 wrapInner 输出
【发布时间】:2017-06-23 17:28:02
【问题描述】:

我很难找出执行以下操作的最佳方法。我得到了 0 到 x 个字符串名称,即:Zillow、Trulia。我想要做的是将图像与这些字符串名称相关联,然后将它们显示到列表中。我正在尝试执行 switch 语句,但不确定这是否适用于超过 1 个条件...如果我错了,请纠正我。

例如,变量列表包含两个项目(Zillow/Trulia),我如何检查 ky split 函数变量的多个值,然后添加输出:$('#review-icon-list').wrapInner('<li class="review-icon">' + zillowImg + '</li>');

现在我的 switch case 抛出了一个意外的令牌错误,但我认为我无论如何都没有使用正确的方法。有谁知道我会怎么做?我会做某种循环吗?如果是,我将如何构建它?

var reviewSiteNames = 'Zillow,Trulia';
    reviewSiteNames = reviewSiteNames.split(',');
    console.log(reviewSiteNames);
    var zillowImg = '<img src="https://s3.amazonaws.com/retain-static/www/zillow.jpg" alt="Zillow">';
    var truliaImg = '<img src="https://s3.amazonaws.com/retain-static/www/trulia.png" alt="Trulia">';

    if (reviewSiteNames == '') {
        $('#no-current-reviewSites').html('No review sites currently added')
    }
    /*else if (reviewSiteNames) {
        $('#review-icon-list').wrapInner('<li class="review-icon"></li>');
    }*/
    switch (true) {
        case (reviewSiteNames.indexOf('Zillow') >= 0):
            $('#review-icon-list').wrapInner('<li class="review-icon">' + zillowImg + '</li>');
            break;
        case (reviewSiteNames.indexOf('Realtor.com') >= 0):
            $('#review-icon-list').wrapInner('<li class="review-icon">' + realtorDotComImg + '</li>');        
            break;        
        case (reviewSiteNames.indexOf('Trulia') >= 0):
            $('#review-icon-list').wrapInner('<li class="review-icon">' + truliaImg + '</li>');
        default: return '';
    }​;

尝试这个的新方法。唯一显示的图像是 each 函数中的最后一个 if 语句。

$.each(reviewSiteNames, function (index, value) {
        if (reviewSiteNames.includes('Zillow')) {
            $('#review-icon-current').wrapInner('<li class="review-icon">' + zillowImg + '</li>');
        }
        if (reviewSiteNames.includes('Trulia')) {
            $('#review-icon-current').wrapInner('<li class="review-icon">' + truliaImg + '</li>');
        }
        //return (value !== 'three');
    });

【问题讨论】:

  • 必须是reviewSiteNames.indexOf('Trulia')吗?为什么不能用=== 代替?
  • @ibrahimmahrir 我使用了这个站点上的一个例子,它使用了indexOf,所以我认为这是正确的方法,但如果=== 有效,那就没问题了。我只是不确定如何让它发挥作用。
  • === 是检查类型是否也匹配的运算符。这不是问题。 switch 语句肯定被滥用了。
  • 错误是因为default: return '';(如果代码没有包装在函数中)。
  • + 你能解释更多你想要达到的目标吗?这仍然是模糊的。

标签: javascript jquery arrays loops


【解决方案1】:

这是我从你的代码中理解的写法:

我认为您想检查 reviewSiteNames 数组中是否有某些特定单词以确定如何包装 #review-icon-list 元素。

// Site names as a string
var reviewSiteNames = 'Zillow,Trulia';

// Site names as an array
reviewSiteNames = reviewSiteNames.split(',');
//console.log(reviewSiteNames);

// Some images used in li wrappers...
var zillowImg = '<img src="https://s3.amazonaws.com/retain-static/www/zillow.jpg" alt="Zillow">';
var truliaImg = '<img src="https://s3.amazonaws.com/retain-static/www/trulia.png" alt="Trulia">';

// If the array is empty
if (reviewSiteNames.length == 0) {
  $('#no-current-reviewSites').html('No review sites currently added')
}

var myHTMLtoInsert = "";

// Check if specific values are in array
if( $.inArray('Zillow', reviewSiteNames) ){
  myHTMLtoInsert += '<li class="review-icon">' + zillowImg + '</li>';

}
if( $.inArray('Realtor.com', reviewSiteNames) ){
  myHTMLtoInsert += '<li class="review-icon">' + realtorDotComImg + '</li>';
}
if( $.inArray('Trulia',, reviewSiteNames) ){ 
   myHTMLtoInsert += '<li class="review-icon">' + truliaImg + '</li>';
}


$('#review-icon-list').html(myHTMLtoInsert);

【讨论】:

  • 我相信这会遇到与我正在尝试的新方法相同的问题。如果reviewSiteNames 中有多个名称,则需要输出所有名称。我将用我当前的 JS 更新我的问题。
  • «如果有多个名字...» 那么#review-icon-list 是否不止一个? id 必须是唯一的。 ;)
  • 我指的是初始逗号分隔列表中的多个名称...var reviewSiteNames = 'Zillow,Trulia';
  • 是的...但我说的是要包装的元素。您不想用多个li 包装此元素的内容...请参阅.wrapInner()
  • 是的,+= 解决了这个问题。谢谢!
【解决方案2】:
// The names:
var names = 'Zillow,Trulia';
names = names.split(',');

// The images mapper: an object that has names as keys and images as values
var images = {
    "Zillow": '<img src="https://s3.amazonaws.com/retain-static/www/zillow.jpg" alt="Zillow">',
    "Trulia": '<img src="https://s3.amazonaws.com/retain-static/www/trulia.png" alt="Trulia">'
};

// if names is empty: (names == '' won't work because names is no longer a string, it's an array now)
if (names.length === 0) {
    $('#no-current-reviewSites').html('No review sites currently added')
}
// if there is names
else {
    // loop through all names
    names.forEach(function(name) {
        // if this name got an image in the images mapper (images[name] !== undefined)
        if(images[name]) {
            // then do magic stuff with it
            $('#review-icon-list').wrapInner('<li class="review-icon">' + images[name] + '</li>');
        }
    });
}

我希望这很有用,因为我不太确定目标到底是什么。

【讨论】:

  • 让我试试看。
  • 这看起来好像只输出 Trulia 而不是 Zillow。我检查了 DOM 以确保。
  • @Paul 这可能是因为你覆盖了元素。你试过append而不是wrapInner吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2022-12-15
  • 2013-12-18
  • 2021-03-22
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多