修改后保留原始阵列顺序吗?

时间:2018-07-27 21:39:06

标签: javascript arrays

我正在尝试将视图固定到数据库具有错误格式的行的命名约定的位置。我无法在查询本身中更正这些约定,因为这会影响网站中的许多功能。因此,我决定使用JavaScript正确地重命名它们,以便它们在视图中以正确的命名约定显示。

为此,我必须在查询中写一个返回虚构数组的查询,如下所示:

原始数组

['Tree_Domestic', Rabbit, Unicorn, Cheetah_Domestic, Shark, Whale_Domestic]

我想要的是扫描整个阵列,仅查找没有的条目具有“ _domestic”或“ _international”并将其替换为“ _international”。例如,[Rabbit,Unicorn,Shark没有_domestic,也没有_international,所以我希望它们像这样:

[Rabbit_International,Unicorn_International,Shark_International]

我成功地做到了这一点,但遇到了最后一个问题,

它按字母顺序修改了数组的顺序,我不希望这样。我希望数组看起来像这样:

['Tree_Domestic', Rabbit_International, Unicorn_International, Cheetah_Domestic, Shark_International, Whale_Domestic]

之所以需要它看起来像这样,是因为在查询中,我还在对最受欢迎的行进行计数,如果我用自己的计数修改了数组,那么计数将不会与数组正确排序使用修改后的数组排序的项目。

这是我的查询:

$sql = 'SELECT animals,
			COUNT(*)
			FROM fictional_signup
			WHERE usergroup NOT IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
		 	GROUP BY popular
		 	ORDER BY COUNT(*) DESC';

JavaScript

var renameLocations = [];

dataLabel = <?php echo json_encode($locations) ?>;
dataCount = <?php echo json_encode($count) ?>;

for(t = 0; t < dataLabel.length; t++){
  if(dataLabel[t].includes('_Domestic') || dataLabel[t].includes('_International')){
    renameLocations.push(dataLabel[t]); 
  }
}
for(z = 0; z < dataLabel.length; z++){
  if(!dataLabel[z].includes('_Domestic') && !dataLabel[z].includes('_International')){
    renameLocations.push(dataLabel[z] + "_International"); 
  }
}

// Returns the correct naming conventions but the order is incorrect with the count.
console.log(renameLocations);

2 个答案:

答案 0 :(得分:1)

您可以使用Array.prototype.map()函数创建具有修改后条目的新数组。

/*
$locations = [
    'Tree_Domestic',
    'Rabbit',
    'Unicorn',
    'Cheetah_Domestic',
    'Shark',
    'Whale_Domestic'
]
*/
dataLabel = <?php echo json_encode($locations) ?>.map(
    // "e" represents each entry in the array, one at a time
    function(e){
        // if the entry ends with _Domestic or _International,
        // then just keep the value
        if (e.endsWith('_Domestic') || e.endsWith('_International'))
            return e;
        // otherwise, append "_International" to the entry and use that
        else
            return e + "_International";
    }
)

产生:

[
    "Tree_Domestic",
    "Rabbit_International",
    "Unicorn_International",
    "Cheetah_Domestic",
    "Shark_International",
    "Whale_Domestic"
]

答案 1 :(得分:0)

您可以将原始数组映射到新数组。这样做将使元素保持其原始顺序。

var originalArray = ['Tree_Domestic', 'Rabbit', 'Unicorn', 'Cheetah_Domestic', 'Shark', 'Whale_Domestic'];
var modifiedArray;

modifiedArray = originalArray.map(function(value, index){
  if (value.indexOf('_Domestic') < 0 && value.indexOf('_International') < 0) {
    return value +'_International';
  }
  
  return value;
});

console.log(modifiedArray);