Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.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 从for循环转换为forEach/map/some。。等_Javascript - Fatal编程技术网

Javascript 从for循环转换为forEach/map/some。。等

Javascript 从for循环转换为forEach/map/some。。等,javascript,Javascript,在下面的代码段中是否可以不使用for循环 const states = [ { a: 1 }, { b: 1 }, { b: 2, c: 1 } ]; const defaultState = { a: 0, b: 0, c: 0 }; const getRange = prop => { const range = []; for (let i = 0; i < states.length; i += 1) { let prevStat

在下面的代码段中是否可以不使用for循环

const states = [
  { a: 1 },
  { b: 1 },
  { b: 2, c: 1 }
];

const defaultState = {
  a: 0,
  b: 0,
  c: 0
};

const getRange = prop => {
  const range = [];

  for (let i = 0; i < states.length; i += 1) {
    let prevState;

    for (let j = i - 1; j >= 0; j -= 1) {
      prevState = states[j] && states[j][prop];
      if (prevState) break;
    }

    range[i] = states[i][prop] || (prevState || defaultState[prop]);
  }

  return range;
};

getRange('a') // [1, 1, 1]
getRange('b') // [0, 1, 2]
getRange('c') // [0, 0, 1]
const states=[
{a:1},
{b:1},
{b:2,c:1}
];
const defaultState={
答:0,,
b:0,
c:0
};
const getRange=prop=>{
常数范围=[];
对于(设i=0;i=0;j-=1){
prevState=州[j]&州[j][prop];
如果(状态)中断;
}
范围[i]=状态[i][prop]| | | | |默认状态[prop]);
}
返回范围;
};
getRange('a')/[1,1,1]
getRange('b')/[0,1,2]
getRange('c')/[0,0,1]
它应该只使用JavaScript,而不依赖任何其他lib,我尝试过使用forEach()和some(),但无法复制当前的行为。这是为了探索语言的目的。

const states=[
{a:1},
{b:1},
{b:2,c:1}
];
const defaultState={
答:0,,
b:0,
c:0
};
const getRange=prop=>{
返回状态。减少((res,o,i)=>{
res.push(o[prop]| | res[i-1]| | defaultState[prop]);
返回res;
}, []);
};
console.log(getRange('a'));//[1, 1, 1]
console.log(getRange('b'));//[0, 1, 2]

console.log(getRange('c'));//[0,0,1]
一个相当直译的代码——每个循环都成为一个方法调用——将

const getRange = defaultStats => state => prop => {
  return states.map((state, i) => {
    const prev = state.slice(0, i-1).reverse().find(s => s[prop]);
    return state[prop] || prev[prop] || defaultState[prop];
  });
};
const states=[{a:1},{b:1},{b:2,c:1}];
constDefaultState={a:0,b:0,c:0};
功能getRange(道具){
让上一个;
返回states.map(s=>
prev=s[prop]| | prev | | defaultState[prop]);
};
log(getRange('a'));
log(getRange('b'));

log(getRange('c'))此代码的作用是什么?@ibrahimmahrir每个州都可以拥有道具,每个道具都可以更改,未更改的道具应该保持不变,在进入新州时不会丢失。示例:
状态1:h:100,w:100//output:h:100,w:100
状态2:h:200//output:h:200,w:100//code>状态3:w:200//output:h:200,w:200//code>永远不要使用
。forEach
@Bergi请详细说明,对于of
循环,它没有好的目的,而这是无法用
更容易实现的。无论如何,你都要避免副作用。@slim我在你发表这篇评论时解释过。输出似乎是正确的,这是否检查了“所有”上一个状态以查看它们中是否存在道具?@user5470921每一步都在寻找前一个状态,所以不需要循环,我们只需检查后面的一步。上一次迭代已经检查了落后的两个步骤。刚刚阅读完reduce()的文档,是的,我们正在进行检查。“你一定会喜欢js的。”易卜拉欣·赫里尔是的,就是那个编辑。更好的做法是测试属性名是否有效,而不是尝试访问属性值并检查它是否未定义。这是一条精彩的线
prev=state.slice(0,i-1).reverse().find(s=>s[prop])
,还没有测试您的解决方案,选择了另一个,我认为它更优雅。