js如何在一个排好数组里插一个数,不改变顺序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js如何在一个排好数组里插一个数,不改变顺序相关的知识,希望对你有一定的参考价值。

js如何在一个排好数组里插一个数,不改变顺序

//商品置顶
    exportsTest.setFirstProduct = function(products)
        if(firstProductpmId)
            var firstProduct;
            for (var i = 0; i < products.length; i++) 
                if (products[i].pmId == firstProductpmId) //判断该活动中有该商品,否则不变。
                    firstProduct = products[i];
                    for (var j = i; j > 0; j--) //将当前商品移到第一个
                        if (j > 0) //不是第一个
                            products[j] = products[j - 1]
                        
                    
                    products[0] = firstProduct;
                    break;
                
            
        
        return products;
    

这个算法效率比较高,其实一个for循环。你要是使用concat代码简单,但是效率会低一些。

参考技术A

var arr = [1,2,3]; 

arr.splice(i,0,a);//i是你要插入的下标;a是你要插入的值

参考技术B var arr = [1,2,3];
arr.push(4); // 从尾部插入
console.log(arr);

参考技术C 插在哪里? 参考技术D 使用array.splice()方法本回答被提问者采纳

PHP 使用 2 个数组,如何根据第一个数组的顺序获取两个数组中存在的第一个元素?

【中文标题】PHP 使用 2 个数组,如何根据第一个数组的顺序获取两个数组中存在的第一个元素?【英文标题】:PHP With 2 arrays how do I get first element that exists in both arrays based on the order of the first array? 【发布时间】:2015-03-05 22:34:28 【问题描述】:

我正在尝试比较两个数组以获取两个数组中存在的第一个元素。我以为我可以使用 array_intersect 来执行此操作,但它似乎不起作用。

这是我的代码的一个代表性示例。

<?php
$a1=array(
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>ZPL</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'));
$a2=array(
    new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>PDF</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PDF</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'),
    new SimpleXMLElement('<LabelSpec><LabelSize>NONE</LabelSize><LabelFormat>NONE</LabelFormat></LabelSpec>')
);

$result=array_intersect($a1,$a2);
print_r($result);
?>

这给了我输出

Array ( [0] => SimpleXMLElement Object ( [LabelSize] => 6 [LabelFormat] => ZPL ) [1] => SimpleXMLElement Object ( [LabelSize] => 6 [LabelFormat] => EPL ) [2] => SimpleXMLElement Object ( [LabelSize] => 6 [LabelFormat] => PNG ) [3] => SimpleXMLElement Object ( [LabelSize] => 6 [LabelFormat] => JPG ) )

如您所见,$a1 中的第一个元素存在于交集中,尽管它在 $a2 中不存在。

【问题讨论】:

一个循环嵌套在另一个循环中就可以了。或者您是否尝试过将数组的元素保留为字符串,只在找到交集后创建一个 SimpleXMLElement? 我从 Web 服务获取两个数组作为 XML 元素。我希望避免使用嵌套循环来提高性能。 【参考方案1】:

这是正常的,因为它只是比较是否是同一类型的对象。

你有两个选择:

    通过将 string 而不是 simpleXMLElement 与 array_intersect 函数进行比较来更改正在使用的参数。不推荐,因为您没有比较每个 xml 节点的实际值。
<?php
$a1=array(
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>ZPL</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'));
$a2=array(
        ('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>PDF</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PDF</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'),
        ('<LabelSpec><LabelSize>NONE</LabelSize><LabelFormat>NONE</LabelFormat></LabelSpec>')
        );

$result=array_intersect($a1,$a2);
print_r($result);

这将返回:

Array
(
    [1] => <LabelSpec><LabelSize>6</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>
    [2] => <LabelSpec><LabelSize>6</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>
    [3] => <LabelSpec><LabelSize>6</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>
)
    编写自定义函数以使用所需逻辑匹配节点的值。这是一个更好的解决方案。
   $a1 = array(
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>ZPL</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'));

    $a2 = array(
        new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>EPL</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PNG</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>PDF</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>PDF</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>8</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>6</LabelSize><LabelFormat>JPG</LabelFormat></LabelSpec>'),
        new SimpleXMLElement('<LabelSpec><LabelSize>NONE</LabelSize><LabelFormat>NONE</LabelFormat></LabelSpec>')
    );

    function customIntersect($arr1, $arr2)
    
        $result = array();
        foreach ($arr1 as $simplexml1) 
        
            foreach ($arr2 as $simplexml2) 
            
                // Your custom comparison logic should be here ...
                if (((string) $simplexml1->LabelSize == (string) $simplexml2->LabelSize) && 
                    ((string) $simplexml1->LabelFormat == (string) $simplexml2->LabelFormat))
                
                    $result[] = $simplexml1;
                
            
        

        return $result;
    

    print_r(customIntersect($a1, $a2));

将返回:

Array
(
    [0] => SimpleXMLElement Object
        (
            [LabelSize] => 6
            [LabelFormat] => EPL
        )

    [1] => SimpleXMLElement Object
        (
            [LabelSize] => 6
            [LabelFormat] => PNG
        )

    [2] => SimpleXMLElement Object
        (
            [LabelSize] => 6
            [LabelFormat] => JPG
        )

)

【讨论】:

我最后选择了选项 1,因为调用 $simpleXml-&gt;asXML() 比使用循环更容易。谢谢

以上是关于js如何在一个排好数组里插一个数,不改变顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何最快在N个有序的整数数组中取得最大K个数?

c语言编程,已经从小到大排好的一维9元素数组在插入一个数,按顺序,怎么写程序?谢谢

在c语言中,如何在数组中插入一个数

Java 对已经排好序的数组进行分组。

在c语言中,将一个数插入一个数组中的程序怎么写?

排序算法思想