Javascript修改数组

时间:2017-08-05 23:43:32

标签: javascript reactjs

如果我有一个如下所示的数组:

RewriteEngine On

//Is file not exist then rewrite to index.php 
RewriteCond %{DOCUMENT_ROOT}/public%{REQUEST_URI} !-f
RewriteRule ^ index.php [QSA,L]

// file exist then rewrite to new path and try again with new path.
RewriteCond %{DOCUMENT_ROOT}/public%{REQUEST_URI} -f
RewriteRule ^(.*)?$ /public/$1 [QSA,L]

我希望使用密钥找到一些东西,然后修改有效负载。

除了遍历数组之外还有其他方法吗?

我有几个关于迭代的问题

  1. 这个数组被许多异步函数使用,我担心在迭代过程中索引可能会被其他一些函数无效。
  2. 迭代可能导致性能下降。
  3. 我考虑过在那里使用不可变对象,但是在每次重新渲染之前转换为数组并不是很有效。

    有什么好主意吗?

6 个答案:

答案 0 :(得分:1)

另一种方法是按照所有项目的键预先构建地图。并沿着阵列传递它。

{
  some_key: {
    key: some_key,
    payload: {}
  },
  some_other_key: {
    key: some_other_key,
    payload: {}
  },
  ...
}

您仍然可以将数组作为数据的另一种表示形式。 实际项目将完全相同,因为地图只会引用列表中的实际项目,但您可以获得最快的访问性能而无需搜索。

此示例显示,实际有效负载仍然是相同的数据,只是它的另一个(索引)表示。

const array = [
  { key: 'one' },
  { key: 'two' }
];

const map = array.reduce((acc, item) => {
  acc[item.key] = item;
  return acc;
},{});

array[0] === map.one // true

答案 1 :(得分:0)

它只是基础的计算机科学。除非您知道起始/结束索引至少接近您期望项目的范围,否则您必须搜索整个空间。

出于您的目的,只使用Array.filter应该足够好了。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

答案 2 :(得分:0)

不是使用带迭代的数组,而只需按键访问值。

var hashtable = {};

// Setting a value...
hashtable["key"] = someValue;

// Getting a value...
var somePayload = hashtable["key"];

你可以很好地迭代一个关联数组,如果由于某种原因你不能简单地将你的数组更改为关联数组,那么到目前为止,你最简单的解决办法就是只需要将一个额外的关联数组作为索引保存。 。

这是一个tutorial on associative arrays in JavaScript。祝你好运。

答案 3 :(得分:0)

当您不知道其位置时,查找数组元素的操作最多必须是线性的。最糟糕的情况仍然是检查每个元素。

就多个异步函数使用的数组而言,无论实际异步操作的完成顺序如何,您仍然可以构建一个以特定顺序影响数组的机制。

承诺在这里很自然。

import UIKit
import AVKit
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //here is where we start up the camera
        let captureSession = AVCaptureSession()
    }
}

答案 4 :(得分:0)

有很多方法, map

var arr = [
   {
       key: 1,
       payload: { }
   }, 
   {
       key: 2,
       payload: { }
   }, 
   {
       key: 3,
       payload: {}
   }
];

arr.map(function(e, i) {
  if(e.key === 1) {
    e.payload = {id: 11, name: "someone" }
  }
})
console.log(arr)

使用findIndex

var arr = [
       {
           key: 1,
           payload: { }
       }, 
       {
           key: 2,
           payload: { }
       }, 
       {
           key: 3,
           payload: {}
       }
    ];
    var elementIndex = arr.findIndex(x => x.key === 1);
    if(elementIndex > -1)
        arr[elementIndex].payload = {id: 11, name: "someone"};
    console.log(arr)

根据您的需要,还有更多选择:)

答案 5 :(得分:0)

如果您愿意更改数据结构的方式,可以使用Map执行以下操作:



var values = [
   {
       key: '4',
       payload: 'a'
   }, 
   {
       key: '5',
       payload: 'b'
   }, 
   {
       key: '6',
       payload: 'c'
   }, 
];

values = new Map(values.map(elem => [elem.key, elem]))

values.set('5', {key: '5', payload: 'x'});

console.log(values.get('5'));